3

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

该视图包含许多绑定到 a 中的属性的文本框NetworkConfigViewModel

<TextBox>
    <TextBox.Text>
        <Binding Path="IP" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

... etc

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

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

我知道我需要调用BindingExpression.UpdateSource()每个文本框。如何以对 MVVM 友好的方式执行此操作?向知道 UI 元素的 ViewModel 添加新的 RelayCommand 似乎不正确。

4

3 回答 3

1

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

我猜你问这个问题是因为你已经实现了具有如下属性的视图模型:

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

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

于 2011-08-11T18:47:14.373 回答
1

确切地说,让 ViewModel 过多地了解 View 是不好的。我最好更新设置副本,让绑定为我完成所有工作。一旦用户单击“保存配置”按钮,我会将更改进一步传播到存储库、模型或其他任何东西......

于 2010-02-18T17:46:05.933 回答
1

所以回到你的例子:

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

private string _myProperty;

public string MyProperty
{

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

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

<TextBox Text="{Binding Model.MyProperty, UpdateSourceTrigger=Explicit}" />
<Button Command="{Binding SaveCommand}" />

...您将把数据输入文本框。现在,当按下 Save 按钮时,我们如何使用来自 TextBox 的更新值来更新模型?

private void SaveExecute()
{
    // How do we update the Model.MyProperty value?
}
于 2011-08-11T19:48:07.197 回答