[英]MVVM ViewModel Cascading Properties
我有一個視圖 model,其屬性為 A、B、C 和 D。其中 D 是 A、B 和 C 的總和。因此,無論何時發生任何更改,我都希望更新 D。 我知道我可以通過觀察 A、B、C 上的 PropertyChanged 事件然后設置 D 的值來實現,如下所示:
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 來實現?
與其在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 A
{
get { return a; }
set
{
if (value == a) return;
a = value;
OnPropertyChanged("A");
OnPropertyChanged("D");
}
}
public int B
{
get { return b; }
set
{
if (value == b) return;
b = value;
OnPropertyChanged("B");
OnPropertyChanged("D");
}
}
等等
然后再
public int D
{
get
{
return A + B + C;
}
}
您可以考慮在其他屬性的“集合”中運行一些代碼:
private int a;
public int A
{
get { return a; }
set
{
a= value;
D = A + B + C
}
}
您可以自己決定是否認為這更優雅,這只是一個建議。
我會像下面這樣使用ReactiveUI Observable As Property Helper :
public class ViewModel : ReactiveObject
{
private int a = 2;
public int A
{
get { return a; }
private set { this.RaiseAndSetIfChanged(ref a, value); }
}
private int b = -1;
public int B
{
get { return b; }
private set { this.RaiseAndSetIfChanged(ref b, value); }
}
private int c = 5;
public int C
{
get { return c; }
private set { this.RaiseAndSetIfChanged(ref c, value); }
}
private ObservableAsPropertyHelper<int> dHelper;
public int D => dHelper.Value;
public ViewModel()
{
dHelper = this.WhenAnyValue(
vm => vm.a,
vm => vm.b,
vm => vm.c,
(a, b, c) => a + b + c)
.ToProperty(this, nameof(D));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.