@page "/" @using BlazorFiddleProject; <button @onclick="changeJustOne">Make a change to just the first data-piece</button> <div> <TickersComponent dataPieces="dataPieces" /> </div> @code { public List<DataPiece> dataPieces; protected override void OnInitialized() { Console.WriteLine("OnInitialized on index.razor"); dataPieces = new List<DataPiece>(); for (int i = 0; i < 200; i++) dataPieces.Add(new DataPiece { Id = i.ToString(), Bid = 1f, Ask = 2f }); base.OnInitialized(); } public void changeJustOne() { dataPieces.First().Bid = 3f; Console.WriteLine("Added..."); } }
namespace BlazorFiddleProject { using Microsoft.AspNetCore.Components.Builder; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Reflection; using System.Linq; public class DataPiece { public string Id { get; set; } public double Bid { get; set; } public double Ask { get; set; } } public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddSingleton<DataPieceAccess>(); } public void Configure(IComponentsApplicationBuilder app) { app.AddComponent<App>("app"); } } public class DataPieceAccess { public IDictionary<string, DataPiece> DataPieceById { get; } = new Dictionary<string, DataPiece>(); } public static class ReflectionHelper { public static IDictionary<string, object> ChildProperties<T>(T obj) { var type = typeof(T); var properties = type .GetProperties() .Select(p => (p.Name, Value: p.GetValue(obj))); return properties.ToDictionary(tuple => tuple.Name, tuple => tuple.Value); } public static IDictionary<string, object> TrackChangeProperties<T>(T obj, Type componentType) { var type = typeof(T); var namesToTrack = TrackChangePropertyNames<T>(componentType); var properties = type .GetProperties() .Where(p => namesToTrack.Contains(p.Name)) .Select(p => (p.Name, Value: p.GetValue(obj))); return properties.ToDictionary(tuple => tuple.Name, tuple => tuple.Value); } private static IEnumerable<string> TrackChangePropertyNames<T>(Type componentType) { var sourceParameterTypeName = typeof(T).Name; var namesDefinedOnClass = componentType .GetCustomAttributes<TrackChangeAttribute>() .Where(tc => sourceParameterTypeName == tc.ParameterTypeName) .Select(tc => tc.ChildPropertyName); var namesDefinedOnProperties = componentType .GetProperties() .SelectMany(p => p.GetCustomAttributes<TrackChangeAttribute>() .Where(tc => sourceParameterTypeName == tc.ParameterTypeName) .Select(tc => tc.ChildPropertyName)); return namesDefinedOnClass.Concat(namesDefinedOnProperties).Distinct(); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = true, Inherited = true)] public class TrackChangeAttribute : Attribute { public TrackChangeAttribute(string parameterTypeName, string childPropertyName) { ParameterTypeName = parameterTypeName; ChildPropertyName = childPropertyName; } public string ParameterTypeName { get; } public string ChildPropertyName { get; } } }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width"> <title>BlazorFiddleProject</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <style> app { } </style> <script type="text/javascript"> </script> </head> <body> <app>Loading...</app> <script src="_framework/blazor.webassembly.js"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>

Add component

BlazorFiddle was updated from Blazor 0.7 to .NET 6.0. Your old source code could not work. You need to upgrade to latest.