Вызов OnPropertyChanged
на рассчитанную недвижимость вполне приемлем. Если у вас есть относительно простая модель, подобная той, которую вы написали, этого будет достаточно.
Если у вас есть несколько вычисляемых свойств в модели, вы можете рассмотреть возможность создания метода для вызова всех из них из одного места вместо вызова каждого из каждого свойства.
Примерно так:
public int Prop1
{
get
{
return _prop1;
}
set
{
_prop1 = value;
OnPropertyChanged();
NotifyCalculatedProperties();
}
}
public int Calc1 { get { /* ... */ } }
public int Calc2 { get { /* ... */ } }
public int Calc3 { get { /* ... */ } }
public void NotifyCalculatedProperties()
{
OnPropertyChanged(nameof(Calc1));
OnPropertyChanged(nameof(Calc2));
OnPropertyChanged(nameof(Calc3));
}
Если вычисленные свойства существуют в другой модели, вы можете зарегистрироваться в этой Model \ VM для события PropertyChanged
источника, а затем вызвать уведомление об изменении там.
Вот так:
void ModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if(e.PropertyName == "Prop1")
OnPropertyChanged(nameof(Calc1));
OnPropertyChanged(nameof(Calc2));
OnPropertyChanged(nameof(Calc3));
}
Только не забудьте отписаться при изменении Model \ VM, иначе у вас будет утечка памяти.
Наконец, вы всегда можете использовать Messenger для передачи сообщений между несвязанными виртуальными машинами, хотя следует соблюдать осторожность, поскольку это очень мощный инструмент, и его легко можно использовать неправильно.
Я не знаю, какой фреймворк MVVM вы используете, но у каждого своя реализация. Вы можете найти более общую информацию о шаблоне Messenger здесь: https://msdn.microsoft.com/en-us/magazine/jj694937.aspx