MVVM检测子类属性变化

3

我正在使用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 => m.ServerName);命令,但不执行NotifyPropertyChanged(m => m.DatabaseInfo);
如何使Database的属性更改时,NotifyPropertyChanged(m => m.DatabaseInfo);命令触发?

如果您需要跟踪子类属性的更改,只需订阅其OnPropertyChanged事件即可。 - Ivan Zub
我已经尝试了下面两种方法,但是 DataBasePropertyChanged 方法从未被调用。这可能是因为这些类都是 Models 而不是 ViewModels 导致的吗?我能在 Model 上实现 PropertyChanged 吗? - BrianKE
你为什么需要这个呢?如果你在XAML中绑定到{Binding DatabaseInfo.ServerName},你的ServerName值将会被更新。那么你为什么还需要一个DatabaseInfo的属性更改呢? - blindmeis
2个回答

2
您可以使用INotifyPropertyChanged接口的PropertyChanged事件来告诉您子属性何时发生更改。
在您的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。 - BrianKE
我已经更新了我的回答...尝试将处理程序附加移动到“DatabaseInfo setter”。 - Sheridan

0
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事件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接