用户确认后,WPF MVVM更新源属性

时间:2014-02-03 07:08:13

标签: c# wpf mvvm binding

我是wpf的新手,我有这种情况。假设我的Customer模型包含FirstNameLastNameTelephone等等。如果需要编辑现有客户的详细信息,则会打开CustomerEdit视图模型,其中包含Customer类型的属性。该视图的一些文本框限定为CurrentCustomer.FirstNameCurrentCustomer.LastName,依此类推。现在,只要用户在这些文本框中提供输入,就会更新有界属性。有一个按钮用于保存所做的更改。有没有办法在按下保存按钮时更新源属性,如果可能,以MVVM方式?

3 个答案:

答案 0 :(得分:5)

默认情况下Text DP,UpdateSourceTrigger值为LostFocus。将其更改为Explicit,然后从保存按钮单击通过获取绑定表达式并在其上调用UpdateSource()来手动更新源。

<强> XAML:

<TextBox x:Name="myTextBox"
         Text="{Binding PropertyName, UpdateSourceTrigger=Explicit}"/>
<Button Click="btnSave_Click"/>

代码背后:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    myTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}

在代码中使用这个逻辑并不违反任何MVVM规则,但如果你不想在代码背后隐藏它。你可以这样做:

在视图模型中创建ICommand 绑定到按钮命令,在命令参数中传递textBox的文本值 。您可以使用RelayCommandDelegateCommand以满足您的需求。对于DelegateCommand,请参阅此here

<TextBox x:Name="myTextBox"
         Text="{Binding PropertyName, UpdateSourceTrigger=Explicit}"/>
<Button Command="{Binding SaveCommand}"
        CommandParameter="{Binding Text, ElementName=myTextBox}"/>

并在ViewModel命令方法中设置textBox文本绑定到的实际值。

private void SaveMethod(object parameter)
{
   this.PropertyName = parameter.ToString();
}

答案 1 :(得分:4)

应用UpdateSourceTrigger显式,如

<TextBox Name="itemNameTextBox"
         Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />

MSDN

  

“如果您有对话框或用户可编辑的表单,并且您想要推迟   源更新,直到用户完成编辑字段和   单击“确定”,您可以设置您的UpdateSourceTrigger值   绑定到明确的“

MVVM风格:

如果你想在MVVM Style中这样做,如果你有多个文本框,那么我建议你使用转换器并在那里创建“Customer”对象,你可以在VM中轻松地回放它。处理VM中的ICommand(将从Button中提取)并使用Converter创建CommandParameter(您可以将文本框值作为输入传递给转换器)。

答案 2 :(得分:1)

在MVVM场景中,在View-model中实现IEditableObject接口,如此解释并在此推荐Answer

IEditableObject是您希望能够回滚更改的好界面。