C# MVVM检测子类的属性更改
我使用的是SimpleMVVM,有两个单独的类(模型),一个使用第二个,如下所示: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
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.
}