Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public class TestModel : NotificationObject, IData
{
[NotifyProperty]
public virtual int Value { get; set; }
public TestModel()
{
Notificator.Create(this);
}
}
class Program
{
[STAThread]
static void Main( string[] args )
{
IUnityContainer container = new UnityContainer();
container.RegisterViewModel<DataAop>();
var dataAop = container.Resolve<DataAop>();
List<IData> listOfData = new List<IData>();
listOfData.Add( dataAop );
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var excludes = new HashSet<Type> { typeof( IData ), typeof( DataAop ), typeof( ProxyData ), typeof( DataObservableObject ) };
listOfData.AddRange( asm.GetTypes()
.Where( t => typeof( IData ).IsAssignableFrom( t ) && !excludes.Contains( t ) ).Select( t => Activator.CreateInstance( t ) as IData ) );
foreach (var notify in listOfData.Cast<INotifyPropertyChanged>())
notify.PropertyChanged += OnPropertyChanged;
DataObservableObject observableData = new DataObservableObject();
var propDesp = DependencyPropertyDescriptor.FromProperty( ObservableObject<int>.ValueProperty, typeof( ObservableObject<int> ) );
propDesp.AddValueChanged( observableData.RealValue, OnPropertyChanged );
listOfData.Add( observableData );
Console.WriteLine( string.Format( "Start ---> {0}", DateTime.Now ) );
Stopwatch sw = new Stopwatch();
foreach (var data in listOfData)
{
sw.Restart();
for (int i = 0; i < 10000000; i++)
data.Value = i;
sw.Stop();
Console.WriteLine();
Console.WriteLine( string.Format( "Iteration date {0}, data name {1}, elapsed {2}",
DateTime.Now, data.GetType().Name, sw.ElapsedMilliseconds ) );
}
Console.WriteLine( string.Format( "Stop ---> {0}", DateTime.Now ) );
Console.ReadKey();
}
static void OnPropertyChanged( object sender, EventArgs e ) { }
static void OnPropertyChanged( object sender, PropertyChangedEventArgs e ) { }
}
public interface IData
{
int Value { get; set; }
}
class DataString : BindableBase, IData
{
int _value;
public int Value
{
get
{
return _value;
}
set
{
if (_value != value)
{
_value = value;
OnPropertyChanged("Value");
}
}
}
}
class DataObservableObject : IData
{
public DataObservableObject()
{
RealValue = new ObservableObject<int>();
}
public ObservableObject<int> RealValue { get; private set; }
public int Value
{
get
{
return RealValue.Value;
}
set
{
RealValue.Value = value;
}
}
}

«Дабпиэф ничего не поделаешь» при отрисовке списка говорят, наверное, только джуны, никогда не читавшие исходников VirtualizingStackPanel
Методы 1, 2 и 3 генерируют одинаковый IL код, разница лишь в предпочтении автора. 1-й может привести к ошибке, в случае переименования свойства,. 2-й метод в этом плане удобнее, т.к. инструмент вроде ReSharper автоматически переименует и свойство, и конструкцию nameof(Property).
Миллион и один день INotifyPropertyChanged