【问题标题】:MVVM: Updating ViewModel properties based on Model propertiesMVVM:根据模型属性更新 ViewModel 属性
【发布时间】:2015-06-09 20:22:34
【问题描述】:

我在 ViewModel 中有一些属性会根据模型属性更新进行更新/重新计算。我要求实现这种情况的最佳方法?

我不喜欢订阅模型的 PropertyChanged 事件处理程序然后更新 ViewModel 属性的方法。您如何处理这种情况?

【问题讨论】:

    标签: c# wpf mvvm viewmodel


    【解决方案1】:

    订阅事件是正确的方法,但我同意你不想使用 PropertyChanged 事件的观点。我喜欢不理会该事件并根据需要创建自己的事件。这是我的方法:

    public class Person : INotifyPropertyChanged
    {
        //custom events as needed
        public event EventHandler NameChanged = delegate { };
    
        //needed for INotifyPropertyChanged 
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
    
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    this.NotifyPropertyChanged();
    
                    //Fire my custom event
                    this.NameChanged(this, EventArgs.Empty);
                }
            }
        }
    
        private int _age;
        public int Age
        {
            get { return _age; }
            set
            {
                if (_age != value)
                {
                    _age = value;
                    this.NotifyPropertyChanged();
    
                    //I am not exposing a custom event for this property.
                }
            }
    
        private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    在此示例中,Name 和 Age 对于 UI 目的是可观察的,但 Name 对于 UI 之外的任何内容都是可观察的。现在,如果您删除任何 PropertyChanged 通知,如果您的 ViewModel 订阅了 PropertyChanged 并解析字符串,则不会意外导致该运行时错误。

    【讨论】:

    • 我喜欢这种方法,听 PropertyChanged Notifications 触发太多次,然后字符串搜索 Property Name 也是我不喜欢的。创建自定义事件似乎是最好的方法。我们还可以将 Prism 或 Unity 事件聚合器与自定义事件一起用于订阅和发布。
    【解决方案2】:

    由于您不想将视图模型的依赖项放在模型内部,因此在视图模型中监听模型更改确实是更新基于模型的视图模型属性的正确方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多