簡體   English   中英

MVVM ViewModel 級聯屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM