RaisePropertyChanged всего объекта, если внутреннее свойство изменилось

я ищу решение для запуска 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 на другие виртуальные машины, если одно из внутренних свойств изменится. поэтому я изменил свойство следующим образом:

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

но это не работает. похоже, что PropertyChanged для MainStatus никогда не срабатывает, если изменяется одно из внутренних свойств. как я могу это исправить?


person el-nino    schedule 26.09.2014    source источник
comment
если он не запущен, это означает, что ваш PropertyChanged EventHandler имеет значение null, это связано с тем, что привязки не разрешены. Просто в качестве теста подпишите свой ViewModel на событие Models PropertyChanged и посмотрите, сможете ли вы после этого принять изменения.   -  person XAMlMAX    schedule 26.09.2014
comment
Ваш Messenger.Default.Send будет вызываться только в том случае, если вы назначите новый экземпляр класса MainStatus своему свойству MainStatus виртуальной машины. Он не будет вызываться, если вы просто измените любое из внутренних свойств MainStatus.   -  person nabulke    schedule 26.09.2014


Ответы (2)


В вашей виртуальной машине вы можете подписаться на событие Mainstatus.PropertyChanged примерно так:

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

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

Если я понимаю вопрос о том, что вы хотите вызывать события изменения свойства для ВСЕХ свойств в классе, реализующем INotifyPropertyChanged, этого можно добиться, вызвав обработчик события с NULL вместо строки, содержащей имя свойства:

например RaisePropertyChanged(null) повысит безопасность и SetUpMode в классе MainStatus, определенном выше.

person AwkwardCoder    schedule 26.09.2014