如果内部属性发生更改,则整个对象的RaisePropertyChanged

时间:2014-09-26 06:50:36

标签: wpf mvvm properties propertychanged

如果其中一个内部属性发生变化,我正在寻找解决整个属性的PropertyChanged的解决方案。所以这是模型:

public class MainStatus : ObservableObject
{
    private bool _safety;
    public bool Safety
    {
        get { return _safety; }
        set
        {
            if (_safety == value)
                return;
            _safety = value;
            RaisePropertyChanged("Safety");
        }
    }
    private bool _setupMode
    public bool SetupMode
    {
        get { return _setupMode; }
        set
        {
            if (_setupMode == value)
                return;
            _setupMode = value;
            RaisePropertyChanged("SetupMode");
        }
    }
}

它有更多属性(bool,int和string)。

在vm中它的使用方式如下:

private MainStatus _mainStatus;
public MainStatus MainStatus
{
    get { return _mainStatus; }
    set
    {
        if (_mainStatus == value)
            return;
        _mainStatus = value;
        RaisePropertyChanged("MainStatus");
    }
}

我可以绑定到这样的内部属性:

<DataTrigger Binding="{Binding MainStatus.Safety}" Value="true">

这一切都很好。但我需要将整个MainStatus发送到其他VM,如果其中一个内部属性发生更改。所以我改变了这个属性:

public MainStatus MainStatus
{
    get { return _mainStatus; }
    set
    {
        if (_mainStatus == value)
            return;
        _mainStatus = value;
        RaisePropertyChanged("MainStatus");
        Messenger.Default.Send<MainStatusMessage>(new MainStatusMessage() { MainStatus = _mainStatus });
    }
}

但这不起作用。看起来如果其中一个内部属性发生变化,MainStatus的PropertyChanged永远不会被触发。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

在您的虚拟机中,您可以订阅Mainstatus.PropertyChanged事件,例如:

 this.MainStatus.PropertyChanged += new PropertyChangedEventHandler(MainStatus_PropertyChanged);

 //..........
 void MainStatus_PropertyChanged(object sender, PropertyChangedEventArgs e)
 {
     RaisePropertyChanged("MainStatus");
 }

答案 1 :(得分:1)

如果我理解你要在实现INotifyPropertyChanged的类上为所有属性引发属性更改事件的问题,可以通过使用NULL而不是包含属性名称的字符串调用事件处理程序来实现:

e.g。 RaisePropertyChanged(null)将在上面定义的MainStatus类上引发Safety和SetUpMode。