一种非常常见的情况。我们有:
double _H;
public double H
{
get { return _H; }
set
{
if (_H == value) return;
_H = value;
SomeMethod("H");
//Inside SomeMethod's body we calculate some other properties among other things,
//and we call their corresponding base.RaisePropertyChanged. ALSO we
//RECALCULATE the freshly set H and we WANT to call base.RaisePropertyChanged("H")
//to "propagate" the changed value back to the View control that called the setter
//portion of the property in the first place!
}
}
答案: 看看周杰伦的帖子。要避开这个问题的关键概念:杰伊提到的异步调用。
更多细节(可能重复或不相关):我有一个NumericUpDown控件,我点击它的按钮来更改其值。问题是我想重新计算给定值并查看是否允许(在视图模型中进行验证)。但是我无法将从控制发送的值推回到属性的设置部分。记住的第一个解决方案是在视图中触发ValueChanged
事件并从那里调用SomeMethod("H")
。虽然不好。
实际上大约有10个NumericUpDown控件。每个的值表示几何形状的维度。因此,一个值的变化可以改变其他维度。当计算确定刚刚给出的值也必须改变时(如果你明白我的意思),就会出现问题。 还有一些相关的XAML代码:
<l:NumericUpDown Value="{Binding H}" Maximum="{Binding MaxSide, Mode=OneTime}"
Grid.Column="7"/>
答案 0 :(得分:4)
您需要使用Dispatcher强制刷新或在setter上下文之外引发属性更改通知(异步调用)。
所以,而不是
base.OnPropertyChanged("H");
...你要做
Action action = () => base.OnPropertyChanged("H");
Dispatcher.CurrentDispatcher.BeginInvoke(action);