MVVM UpdateSourceTrigger

时间:2010-02-18 17:39:22

标签: c# wpf mvvm updatesourcetrigger

我正在开发一个MVVM应用程序,并且有一个用于修改许多网络参数(IP,SubnetMask等)的视图。

该视图包含许多绑定到NetworkConfigViewModel

中的属性的文本框
<TextBox>
    <TextBox.Text>
        <Binding Path="IP" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

... etc

该视图还包含一个名为Save Configuration的按钮。该按钮绑定到ViewModel中的RelayCommand,负责根据请求将配置保存到远程设备。

我想修改文本框绑定以使用UpdateSourceTrigger="Explicit",以便ViewModel仅在用户显式单击“保存配置”时更新,而不是在修改值时进行更新。

我知道我需要为每个文本框调用BindingExpression.UpdateSource()。我怎样才能以MVVM友好的方式做到这一点?将新的RelayCommand添加到知道UI元素的ViewModel似乎不正确。

3 个答案:

答案 0 :(得分:1)

确切地说,让ViewModel了解View太多并不好。我最好更新一下设置副本,让绑定对我来说都有用。用户单击“保存配置”按钮后,我会将更改进一步传播到存储库,模型或其他任何内容......

答案 1 :(得分:1)

请勿在视图模型的绑定中实现此功能。在视图模型中实现它。视图模型的属性应该始终反映视图中的内容 - 它被称为视图模型,因为它毕竟是视图的模型。

我猜你在问这个问题,因为你已经用这样的属性实现了视图模型:

public string MyProperty
{
   get { return _Model.MyProperty; } 
   set
   {
      _Model.MyProperty=value;
      OnPropertyChanged("MyProperty");
   }
}

不要这样做。将属性值存储在专用支持字段中,并在“保存配置”方法中更新模型属性。

答案 2 :(得分:1)

回过头来看一下你的例子:

如果ViewModel的属性具有私有支持字段,而不是像这样公开模型的属性 -

private string _myProperty;

public string MyProperty
{

    get { return _myProperty; }
    set
    {
        if (_myProperty != value)
        {
            _myProperty = value;
            OnPropertyChanged("MyProperty");
        }
    }
}

View中的控件绑定到什么?如果绑定到仅公开私有支持字段的属性,那么任何数据如何进入视图?例如,TextBox无法再绑定到ViewModel属性MyProperty,因为它没有暴露Model.MyProperty。它只是暴露了_myProperty。如果您在View:

中绑定到Model.MyProperty,就像这样
<TextBox Text="{Binding Model.MyProperty, UpdateSourceTrigger=Explicit}" />
<Button Command="{Binding SaveCommand}" />

...您将获取数据到TextBox。现在,当按下Save按钮时,我们如何使用TextBox中的更新值更新模型?

private void SaveExecute()
{
    // How do we update the Model.MyProperty value?
}