【发布时间】:2014-12-17 09:03:18
【问题描述】:
查看Windows Power Options,turn off the display中有两个combo-box,一个是Battery,另一个是Plugged in。
现在要求Battery 中的值应始终小于Plugged in 中的值。
所以如果Battery 最初设置为25 分钟,然后Plugged in 设置为10 分钟,Battery 的值应自动更改为5 分钟。 更改一个值可能会影响另一个值。
代码是实现INotifyPropertyChanged 的普通ViewModel。
public class MyViewModel : INotifyPropertyChanged
{
private uint pluggedIn;
public uint PluggedIn
{
get { return pluggedIn;}
set
{
if (pluggedIn != value)
{
pluggedIn = value;
OnPropertyChanged("PluggedIn");
}
}
}
public uint Battery{...} //the same implementation
}
我修改了设置器以应用规则。
set
{
if (pluggedIn != value)
{
pluggedIn = value;
OnPropertyChanged("PluggedIn");
if (Battery >= PluggedIn)
{
Battery = FindTheValueLessThanPluggedIn(); //this can potentially modify the value of PluggedIn from the setter of Battery.
}
}
}
问题。
您可以看到调用 Bettery 的 setter 也可能会影响 PluggedIn 的值,如果我有其他要求,我将不得不编写一些难以阅读/维护的代码来实现这个看似简单的任务。
问题
我可以先计算两个属性的最终值,我需要一个“原子”操作,可以一次更新两个属性(不相互影响),在这个“原子”操作完成后,触发@987654333 @事件为两个属性更新UI。
再想一想
在发布后阅读我的问题后,我想我已经回答了我自己的问题 - 设置支持字段而不是调用 setter,但其他更好的方法?
CalculateNewVaules(out newValue1, out newValue2);
pluggedIn = newValue1;
battery = newValue2;
OnPropertyChanged("PluggedIn");
OnPropertyChanged("Battery");
【问题讨论】:
标签: c# wpf mvvm inotifypropertychanged