mvvm更新计算字段

时间:2018-08-28 11:53:41

标签: wpf mvvm

您了解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 :(得分:2)

在计算所得的属性上调用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在不相关的VM之间传递消息,尽管您应谨慎使用,因为它是一个非常强大的工具,很容易被滥用。
我不知道您使用的是什么MVVM框架,但是每个都有自己的实现。您可以在此处找到有关Messenger模式的更多常规详细信息:https://msdn.microsoft.com/en-us/magazine/jj694937.aspx