C# MVVM检测子类的属性更改

C# MVVM检测子类的属性更改,c#,wpf,mvvm,inotifypropertychanged,simple-mvvm,C#,Wpf,Mvvm,Inotifypropertychanged,Simple Mvvm,我使用的是SimpleMVVM,有两个单独的类(模型),一个使用第二个,如下所示: public class Database : ModelBase<Database> { public String ServerName //{ get; set; } { get { return _ServerName; } set { if

我使用的是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();
}
公共类数据库:ModelBase
{
公共字符串ServerName/{get;set;}
{
获取{return\u ServerName;}
设置
{
if(_ServerName!=值)
{
_ServerName=value;
NotifyPropertyChanged(m=>m.ServerName);
}
}
}
私有字符串\u ServerName=“MyTestServer”;
//为简洁起见,删除了其他属性
}
公共类MyConfiguration
{
/// 
///数据库信息
/// 
公共数据库信息
{
获取{return\u DatabaseInfo;}
设置
{
if(_DatabaseInfo!=值)
{
_DatabaseInfo=值;
NotifyPropertyChanged(m=>m.DatabaseInfo);
}
}
}
私有数据库_DatabaseInfo=新数据库();
}
更改
'ServerName'
时,
NotifyPropertyChanged(m=>m.ServerName)命令,但不执行
NotifyPropertyChanged(m=>m.DatabaseInfo)

如何更改
NotifyPropertyChanged(m=>m.DatabaseInfo)数据库
的某个属性发生更改时,code>触发?

您可以使用
INotifyPropertyChanged
界面的来告诉您子属性何时更改

在您的
MyConfiguration
类中:

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

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

private void DataBasePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "ServerName") NotifyPropertyChanged(m => m.DatabaseInfo);
}
请参阅此处的文档


如果您需要跟踪子类属性的更改,您可以订阅它的OnPropertyChanged事件。我尝试了下面两种方法,但从未调用DataBasePropertyChanged方法。这可能是因为这些类都是模型而不是视图模型吗?我可以在模型上实现一个属性更改吗?为什么需要这个?如果您将xaml中的任意位置绑定到{Binding DatabaseInfo.ServerName},您的ServerName值将被更新。为什么还需要更改DatabaseInfo的属性?我将其添加到MyConfiguration类中,但DatabasePropertyChanged方法从未被命中。我确实将方法名称更改为DataBasePropertyChanged。我已更新我的答案。。。尝试将处理程序附件移动到
数据库信息设置器
private void DataBasePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "ServerName") NotifyPropertyChanged(m => m.DatabaseInfo);
}
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.
}