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

el-*_*ino 2 wpf properties mvvm 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在虚拟机中它的使用方式如下:

private MainStatus _mainStatus;
public MainStatus MainStatus
{
    get { return _mainStatus; }
    set
    {
        if (_mainStatus == value)
            return;
        _mainStatus = value;
        RaisePropertyChanged("MainStatus");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<DataTrigger Binding="{Binding MainStatus.Safety}" Value="true">
Run Code Online (Sandbox Code Playgroud)

这一切都很好。但如果内部属性之一发生变化,我需要将整个 MainStatus 发送到其他虚拟机。所以我像这样改变了属性:

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

但这不起作用。MainStatus如果内部属性之一发生变化,似乎永远不会触发 PropertyChanged 。我该如何解决这个问题?

Bol*_*olu 6

在您的虚拟机中,您可以订阅Mainstatus.PropertyChanged类似以下的事件:

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

 //..........
 void MainStatus_PropertyChanged(object sender, PropertyChangedEventArgs e)
 {
     RaisePropertyChanged("MainStatus");
 }
Run Code Online (Sandbox Code Playgroud)