MVVM模式基础知识

时间:2011-06-02 12:05:51

标签: .net wpf mvvm

一种非常常见的情况。我们有:

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"/>

1 个答案:

答案 0 :(得分:4)

您需要使用Dispatcher强制刷新或在setter上下文之外引发属性更改通知(异步调用)。

所以,而不是

base.OnPropertyChanged("H");

...你要做

Action action = () => base.OnPropertyChanged("H");
Dispatcher.CurrentDispatcher.BeginInvoke(action);