我正在开发一个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似乎不正确。
答案 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?
}