我有一个具有属性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实现这一点?
答案 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);
如果你认为这更优雅,你可以自己决定,只是一个建议。