2015-09-22 4 views
2

Я работаю над проектом WPF. Чтобы предотвратить много кода котла, я использую Fody PropertyChanged. Это фрагмент из моей проблемы:Fody PropertyChanged не вызывает другое свойство

[ImplementPropertyChanged] 
public class MyViewModel : MyViewModelBase 
{ 
    public bool HasCardSet 
    { 
     get 
     { 
      return Person != null && Person.Card != null; 
     } 
    } 

    public void SavePerson() 
    { 
     Person.Card = new Card(); 
    } 
} 

[ImplementPropertyChanged] 
public class MyViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Person Person { get; set; } 
} 

[ImplementPropertyChanged] 
public class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Card Card { get; set; } 
} 

[ImplementPropertyChanged] 
public class Card : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Name { get; set; } 
    public ObservableCollection<SomeOtherClass> Items { get; set; } 
} 

Когда я называю SavePerson()MyViewModel), это не вызовет HasCardSet свойства. Я добавил PropertyChangedNotificationInterceptor и вижу, что свойство «Карточка» меняется на целевые «Люди». Но моя точка останова в HasCardSet не срабатывает.

+0

Как бы привязаны теперь, что HasCardSet изменился, если он не является частью Лица? – netaholic

+0

Ну, у моего Лица есть другое свойство Info (класс), и у него есть имя свойства string. (Person.Info.Name) Если я изменю его в коде, моя привязка в XAML будет обновлена. Так почему это работает, а это не так? – RvdK

+0

@OP: Это зависит от того, как вы обновляете свойство (задаете ли вы свойство Person's Info или просто имя этого свойства?) И само связывание. Больше вашего кода может помочь ... – xum59

ответ

2

IMO Ваше имущество HasCardSet должно быть объявлено в классе Person.

Тогда, как это было предложено в documentation, добавить этот метод:

public void OnCardChanged() 
{ 
    HasCardSet = Card != null; 
} 

Это вызовет ожидаемый PropertyChanged событие.

Обратите внимание, что ваш Binding должен иметь ваш объект Person как DataContext, а не непосредственно на вашей виртуальной машине.

+0

Перемещено HasCardSet для человека и обновлено XAML для прослушивания Person.HasCardSet. Это сработало! Не использовал OnCardChanged. – RvdK