c# - 在MVVM中,当一个属性的值依赖于另一个属性时,是否有一种标准方法可以自动NotifyPropertyChanged?

标签 c# wpf mvvm

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

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);
        }
    }

    // . . .
}

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

最佳答案

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

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

关于c# - 在MVVM中,当一个属性的值依赖于另一个属性时,是否有一种标准方法可以自动NotifyPropertyChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10287317/

相关文章:

c# - 我是否实例化了一个无效的对象?

c# - 如何在 ASP.NET Core 中添加出站重写规则

c# - 在 MVVM 中给出一些命令来查看

c# 匿名类有什么方法可以逃脱内部作用域 block 吗?

c# - 以下哪一个是存储库模式?

c# - 在代码中设置静态资源

c# - Task.Factory.StartNew 抛出异常

c# - 如何检测是否按下了任何键盘功能键?

c# - 通过操作/命令在数据上下文中设置属性

c# - 以下设置不匹配,使用 Moq 进行 WPF MVVM 单元测试