我是wpf的新手,我有这种情况。假设我的Customer
模型包含FirstName
,LastName
,Telephone
等等。如果需要编辑现有客户的详细信息,则会打开CustomerEdit
视图模型,其中包含Customer
类型的属性。该视图的一些文本框限定为CurrentCustomer.FirstName
,CurrentCustomer.LastName
,依此类推。现在,只要用户在这些文本框中提供输入,就会更新有界属性。有一个按钮用于保存所做的更改。有没有办法在按下保存按钮时更新源属性,如果可能,以MVVM方式?
答案 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的文本值 。您可以使用RelayCommand
或DelegateCommand
以满足您的需求。对于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
是您希望能够回滚更改的好界面。