MVVM ViewModel级联属性

时间:2015-08-21 15:55:15

标签: c# mvvm viewmodel reactiveui

我有一个具有属性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实现这一点?

2 个答案:

答案 0 :(得分: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 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;
    }
} 

答案 1 :(得分:0)

你可以考虑在' set'中运行一些代码。其他属性:

var water_pipes_size_array = [0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 8, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var new_water_pipes_size_array  = [];
new_water_pipes_size_array=$.map( water_pipes_size_array, function( value,index ) {
  return water_pipes_size_array[index+1]==value ? value : null;
});
console.log(new_water_pipes_size_array);

如果你认为这更优雅,你可以自己决定,只是一个建议。