短篇小说
我有一个BindingExpression对象,我想更新绑定的目标端,就像我可以使用源代码一样(通过调用BindingExpression.UpdateSource)。我该怎么办?
WPF也有类似的问题,我不知道如何适应Silverlight:Cancel combobox selection in WPF with MVVM
长篇故事
给定双向绑定,将组合框的SelectedItem绑定到视图模型的属性。组合框用于导航,以便通过选择用户告知视图模型导航。视图模型可以有一些未保存的更改,用户不希望意外地丢失。因此视图模型会抛出一个确认对话框,询问用户是否真的要离开并松开他们的更改。如果用户拒绝,我们要撤消对组合框的选择,以使其处于原始状态,就像导航尝试之前一样。我该怎么办?
适用于WPF用户 请注意,Silverlight中没有UpdateTarget方法(据我所知),所以这就是提出这个问题的原因。
答案 0 :(得分:1)
如果我理解正确,当属性发生变化时,您应该将SelectedItem
支持字段的先前值存储在视图模型的atrribute上,当用户决定取消确认对话框时,您应该将SelectedItem
支持字段恢复为之前的值。
如果您使用支持字段的常规属性,则可以编写实现此行为的Set方法:
private object selectedItemPreviousValue;
private object selectedItemBackingField;
public object SelectedItemBackingField
{
get
{
return selectedItemBackingField;
}
set
{
selectedItemPreviousValue = selectedItemBackingField;
selectedItemBackingField = value;
}
}
如果您使用的是依赖属性,则必须提供PropertyMetada
DependencyPropertyChantged
回调,如下所示:
public object SelectedItemBackingField
{
get { return (object)GetValue(SelectedItemBackingFieldProperty); }
set { SetValue(SelectedItemBackingFieldProperty, value); }
}
// Using a DependencyProperty as the backing store for SelectedItemBackingField. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedItemBackingFieldProperty =
DependencyProperty.Register("SelectedItemBackingField", typeof(object), typeof(MapApp), new PropertyMetadata(new PropertyChangedCallback(OnSelectedItemChanged));
public static OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
MyViewModel vm = (MyViewModel)sender;
vm.selectedItemPreviousValue = args.OldValue;
}