【问题标题】:MVVM Detect property change of subclassMVVM 检测子类的属性变化
【发布时间】:2014-08-12 15:31:48
【问题描述】:

我正在使用 SimpleMVVM 并且有两个单独的类(模型),一个使用第二个,如下所示:

    public class Database : ModelBase<Database>
    {
        public String ServerName //{ get; set; }
        {
            get { return _ServerName; }
            set
            {
                if (_ServerName != value)
                {
                    _ServerName = value;
                    NotifyPropertyChanged(m => m.ServerName);
                }
            }
        }
        private String _ServerName = "MyTestServer";

        // other properties removed for brevity
    }

public class MyConfiguration
{
        /// <summary>
        /// Database information
        /// </summary>
        public Database DatabaseInfo
        {
            get { return _DatabaseInfo; }
            set
            {
                if (_DatabaseInfo != value)
                {
                    _DatabaseInfo = value;
                    NotifyPropertyChanged(m => m.DatabaseInfo);
                }
            }

        }
        private Database _DatabaseInfo = new Database();
}

'ServerName' 改变时,NotifyPropertyChanged(m =&gt; m.ServerName); 命令执行但NotifyPropertyChanged(m =&gt; m.DatabaseInfo); 不执行

Database 的属性之一发生变化时,如何使NotifyPropertyChanged(m =&gt; m.DatabaseInfo); 触发?

【问题讨论】:

  • 如果您需要跟踪子类属性的变化,您可以订阅它的 OnPropertyChanged 事件。
  • 我尝试了以下两种方法,但从未调用过 DataBasePropertyChanged 方法。这可能是因为这些类都是模型而不是视图模型吗?我可以在模型上实现 PropertyChanged 吗?
  • 你为什么需要这个?如果您将 xaml 中的任何位置绑定到 {Binding DatabaseInfo.ServerName} 您的 ServerName 值将被更新。为什么还需要更改 DatabaseInfo 的属性?

标签: c# wpf mvvm inotifypropertychanged simple-mvvm


【解决方案1】:

您可以使用INotifyPropertyChanged接口的PropertyChanged event来告诉您子属性何时发生变化。

在您的MyConfiguration 班级中:

public Database DatabaseInfo
{
    get { return _DatabaseInfo; }
    set
    {
        if (_DatabaseInfo != value)
        {
            _DatabaseInfo = value;
            NotifyPropertyChanged(m => m.DatabaseInfo);
            DatabaseInfo.PropertyChanged += DataBasePropertyChanged;
        }
    }
}

...

private void DataBasePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    NotifyPropertyChanged(m => m.DatabaseInfo);
}

请注意,您每次更改DatabaseInfo 属性值时都需要附加此侦听器。另外,请注意,如果您只想听一个属性,那么您可以这样做:

private void DataBasePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "ServerName") NotifyPropertyChanged(m => m.DatabaseInfo);
}

【讨论】:

  • 我将此添加到 MyConfiguration 类中,但 DatabasePropertyChanged 方法永远不会受到影响。我确实将方法名称更改为 DataBasePropertyChanged。
  • 我已经更新了我的答案...尝试将处理程序附件移动到DatabaseInfo setter
【解决方案2】:
private Database _DatabaseInfo = new Database();

public MyConfiguration()
{
  this._DatabaseInfo.PropertyChanged += new PropertyChangedEventHandler(propChanged);
}

private void propChanged(object sender, PropertyChangedEventArgs e)
{
  // Now you can update the _DatabaseInfo.DatabaseInfo property to force the property changed event to fire.
}

请参阅此处的文档

INotifyPropertyChanged.PropertyChanged event

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多