1

У меня есть приложение Windows Phone 8 с использованием Fody для ввода INotifyPropertyChanged в свойства. У меня есть класс Сначала со свойством А, который переплетен в текстовое поле в Виде:Свойство в зависимости от свойства другого класса

[ImplementPropertyChanged] 
public class First 
{ 
    public int A { get; set; } 

    public int AA { get {return A + 1; } } 
} 

А класс Второго со свойством В зависимости от свойств A (также переплетено в текстовое поле):

[ImplementPropertyChanged] 
public class Second 
{ 
    private First first; 

    public int B { get {return first.A + 1; } } 
} 

Обновления и AA работает отлично, однако B не обновляется автоматически, когда сначала изменяется. Есть ли простой и чистый способ добиться таких автоматических обновлений с использованием fody или мне нужно создать собственное событие для его обработки?

ответ

1

Я закончил с использованием стандартного INotifyPropertyChanged в том смысле, который предложил SKall.

public class First : INotifyPropertyChanged 
{ 
    public int A { get; set; } 

    public int AA { get {return A + 1; } } 

    (...) // INotifyPropertyChanged implementation 
} 

public class Second : INotifyPropertyChanged 
{ 
    private First first; 

    public Second(First first) 
    { 
     this.first = first; 
     this.first.PropertyChanged += (s,e) => { FirstPropertyChanged(e.PropertyName); 

     public int B { get {return first.A + 1; } } 

     protected virtual void FirstPropertyChanged(string propertyName) 
     { 
      if (propertyName == "A") 
       NotifyPropertyChanged("B"); 
     } 

     (...) // INotifyPropertyChanged implementation 
    } 
}; 
1

Я не знаком с Fody, но я подозреваю, что это не потому, что на Second.B нет сеттера. Во-вторых, должны подписаться на изменения в первой и если First.A это свойство изменяется, то, что следует использовать (частный) сеттера Б.

Альтернативно подписаться на первой и затем вызвать В свойством измененное событие:

[ImplementPropertyChanged] 
public class Second 
{ 
    private First first; 

    public int B { get {return first.A + 1; } } 

    public Second(First first) 
    { 
     this.first = first; 
     this.first.OnPropertyChanged += (s,e) => 
     { 
      if (e.PropertyName == "A") this.OnPropertyChanged("B"); 
     } 
} 
+0

Setter не нуждается в обновлении представления. Я добавил свойство AA в First, которое будет обновляться просто отлично, когда A изменится. То, что я прошу, это функциональность Fody, чтобы избежать создания ручных подписей во втором. –

+0

Собственно, глядя на Фоди, это необходимо. В случае нахождения внутри класса-владельца он просто автоматически вводится в код: https://github.com/Fody/PropertyChanged – SKall

+0

Я видел, что раньше, однако, это не решило мою проблему. Конечно, я мог бы добавить событие и обработать его во втором, установив B с помощью частного сеттера, чтобы заставить обновление, но, к сожалению, это решение не масштабируется. –

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