2015-08-21 90 views
1

我有一個屬性A,B,C和D的視圖模型。其中D是A,B和C的總和。因此,無論何時發生這些更改,我都希望D被更新。我知道我可以通過觀察在A,B,C的PropertyChanged事件,然後設定值d,這樣做:MVVM ViewModel級聯屬性

public MyViewModel() 
{ 
    this.PropertyChanged += ViewModelPropertyChanged; 
} 

private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    // Track changes to update sum 
    if (e.PropertyName == "A" || e.PropertyName == "B" || e.PropertyName == "C") 
    { 
     D = A + B + C; 
    } 
} 

但我不知道是否有更優雅或存在更多的自動化?

更新此項以添加屬性的示例。我正在使用封裝邏輯的框架:是不同的,並引發屬性更改事件。

private int _A; 
    public int A 
    { 
     get { return _A; } 
     set { RaiseAndSetIfChanged(ref _A, value); } 
    } 

更新#2:有沒有人有一個如何使用ReactiveUI實現的例子?

+2

我認爲你應該考慮https://github.com/reactiveui/ReactiveUI/blob/master/ReactiveUI/ObservableAsPropertyHelper.cs –

+0

反應過去了我的想法。你有沒有任何示例代碼@jmelosegui? –

回答

4

而不是做你ViewModelPropertyChanged實際的數學我會做類似

private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    // Track changes to update sum 
    if (e.PropertyName == "A" || e.PropertyName == "B" || e.PropertyName == "C") 
    { 
     OnPropertyChanged("D"); 
    } 
} 

然後做數學在物業本身

public int D 
{ 
    get 
    { 
     return A + B + C; 
    } 
} 

或者你可以做到這一點(這是我更喜歡看下面的評論)

然後再次

public int D 
{ 
    get 
    { 
     return A + B + C; 
    } 
} 
+0

我認爲這更優雅,把額外的代碼放在其他屬性的集合中。 +1 –

+0

不利的一面是,該類必須將自己的PropertyChanged事件賦予其中,而我不喜歡 –

+0

真的,這裏有一篇文章。 http://stackoverflow.com/questions/4031157/is-it-poor-form-for-ac-sharp-class-to-subscribe-to-its-own-published-events –

0

你可以考慮運行中的其他屬性的「設置」部分代碼:

private int a; 
public int A 
{ 
    get { return a; } 
    set 
    { 
     a= value; 
     D = A + B + C 
    } 
} 

您可以爲自己,如果你認爲這是決定更優雅,只是一個建議。

+0

我不認爲這是一個很好的解決方案,因爲有多個依賴關係。在D的get訪問器中進行計算可能是比這更好的方法。 –

+0

我同意,在胡安的回答中看到我的評論。 –