2014-09-26 2 views
0

Я ищу решение для пожара PropertyChanged из всего свойства, если изменяется одно из внутренних свойств. поэтому вот модель:RaisePropertyChanged из всего объекта, если изменилось внутреннее свойство

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).

в виртуальной машине используется так:

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

+1

если он не уволен, чем это означает, что ваш 'PropertyChanged' EventHandler имеет нулевое значение, это связанно с креплений не решены. Так же, как тест, подпишитесь на свой «ViewModel» на «Свойство PropertyChanged» Model и посмотрите, сможете ли вы получить изменения. – XAMlMAX

+0

Ваш «Messenger.Default.Send» вызывается только в том случае, если вы присваиваете экземпляр класса «MainStatus» _new_ для вашего свойства «MainStatus» vm. Он не будет вызываться, если вы просто измените любой из внутренних свойств MainStatus. – nabulke

ответ

3

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

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

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

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

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

Смежные вопросы