mvvm обновляет вычисляемые поля - PullRequest
0 голосов
/ 28 августа 2018

Знаете ли вы лучшие практики wpf+mvvm для обновления вычисляемых полей? Что я могу сделать вместо OnPropertyChanged(nameof(Summary))?

Также вычисляемое поле может находиться в другой модели представления, и эта модель представления не должна знать обо всех зависимостях.

Это мой код:

public class Model
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }
    public int Summary => Prop1 + Prop2;
}

public class ViewModel : BaseViewModel
{
    public Model Model { get; }

    public int Prop1
    {
        get
        {
            return Model.Prop1;
        }
        set
        {
            Model.Prop1 = value;
            OnPropertyChanged();
            OnPropertyChanged(nameof(Summary));
        }
    }

    public int Prop2
    {
        get
        {
            return Model.Prop2;
        }
        set
        {
            Model.Prop2 = value;
            OnPropertyChanged();
            OnPropertyChanged(nameof(Summary));
        }
    }

    public int Summary => Model.Summary;
}

1 Ответ

0 голосов
/ 28 августа 2018

Вызов 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...