如何在wpf中有选择地更新模型

如何在wpf中有选择地更新模型,wpf,data-binding,Wpf,Data Binding,单击listviewitem时,我在listview中显示了一个模型列表。我打开了一个绑定到listviewitem数据模型的对话框,允许用户编辑各种属性 我正在试图找出如何处理“确定”和“取消”按钮。一方面,如果我将对话框直接绑定到listviewitem的模型,则似乎无法取消该操作 另一方面,如果我给对话框一个模型的克隆(因为我的模型可克隆的开销,所以在这个问题上不是很流行),取消很容易处理,但将新数据导入现有模型是一件痛苦的事情,因为我必须通过克隆将所有属性复制回原始模型 我怀疑有一个很好

单击listviewitem时,我在listview中显示了一个模型列表。我打开了一个绑定到listviewitem数据模型的对话框,允许用户编辑各种属性

我正在试图找出如何处理“确定”和“取消”按钮。一方面,如果我将对话框直接绑定到listviewitem的模型,则似乎无法取消该操作

另一方面,如果我给对话框一个模型的克隆(因为我的模型可克隆的开销,所以在这个问题上不是很流行),取消很容易处理,但将新数据导入现有模型是一件痛苦的事情,因为我必须通过克隆将所有属性复制回原始模型


我怀疑有一个很好的设计模式。有什么想法吗?

您可以将所有绑定更改为“显式”,因为它们不会自动将值推回到源,然后在单击“确定”按钮时强制更新

例如,让我们使用显式更新模式将文本框绑定到模型的“Foo”属性:

<TextBox x:Name="fooEdit" Text="{Binding Foo,UpdateSourceTrigger=Explicit}" />
如果您有很多控件,这可能有点麻烦,但它可以让您完全控制从绑定控件更新基础属性的时间

更新


我应该补充一点,您还应该看看接口,它是为您描述的场景而设计的。如果您可以在您的模型或中间ViewModel上实现此功能,则会使生活更加轻松。

显式更新有希望,但遍历每个properties ui元素并命名特定的dependency属性的想法似乎不太理想。我同意。IEditableObject是更好的方法。但这两种方法都不是特别容易。回答得好。IEditableObject是实现IMHO的方法。我知道拥有丰富的基类已经不再时髦和酷了,但是f---it,我仍然使用我的BusinessObject基类,它将属性值存储在PropertyBag对象中。PropertyBag易于克隆,BusinessObject实现了IEditableObject。
BindingExpression be = fooEdit.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();