2

我使用 MVVM 模式已经有一段时间了,并且经常遇到一个属性的值取决于另一个属性的值的场景。例如,我有一个具有高度和宽度的控件,我想将控件上的高度和宽度显示为格式化字符串“{height} x {width}”。所以我在我的视图模型中包含以下属性:

public class FooViewModel : INotifyPropertyChanged
{
    // . . .

    private double _width;
    public double Width
    {
        get { return _width; }
        set
        {
            if(_width != value)
            {
                _width = value;
                NotifyPropertyChanged("Width");
                NotifyPropertyChanged("DisplayString"); // I had to remember to
                                                        // do this.
            }
        }
    }

    public string DisplayString
    {
        get
        {
            return string.Format("{0} x {1}", _width, _height);
        }
    }

    // . . .
}

然后我将我的内容绑定到LabelDisplayString 属性,这似乎比使用 aIMultiValueConverter从 Width 和 Height 属性进行转换要方便得多。不方便的部分是,在我需要为“宽度”或“高度”通知属性更改的任何地方,我还必须记住通知“显示字符串”。我可以想出无数种不同程度的自动化方法,但我的问题是,在 MVVM 中是否存在人们通常用来执行此操作的标准做法WPF

4

2 回答 2

2

不,没有标准的方法可以做到这一点。

您可以编写具有 PropertyChanged 辅助方法的基本视图模型类。它将查看具有 DependsOn 属性(您也将创建)的类的属性,并为依赖于更新属性的所有属性触发事件。

于 2012-04-23T20:08:49.420 回答
1

如果 ViewModel 中的属性之间存在很多依赖关系,您可以使用空字符串调用 NotifyPropertyChanged 来刷新从 View 绑定的所有元素。我认为自动化这一点没有意义。

于 2012-04-23T20:01:58.240 回答