【问题标题】:How can I cancel a combobox selection in Silverlight?如何在 Silverlight 中取消组合框选择?
【发布时间】:2012-11-23 12:36:29
【问题描述】:

短篇小说

我有一个 BindingExpression 对象,我想更新绑定的目标端,就像我可以对源进行更新一样(通过调用 BindingExpression.UpdateSource)。我该怎么做?

WPF 有类似的问题,我不知道如何适应 Silverlight:Cancel combobox selection in WPF with MVVM

长篇大论

给定一个双向绑定,将组合框的 SelectedItem 绑定到视图模型的属性。组合框用于导航,以便通过选择用户告诉视图模型导航离开。视图模型可能有一些用户不想意外丢失的未保存更改。所以视图模型会抛出一个确认对话框,询问用户是否真的想要离开并放弃他们的更改。如果用户说不,我们想要撤消对组合框所做的选择,使其处于原始状态,就像在进行导航尝试之前一样。我该怎么做?

对于 WPF 人员 请注意,Silverlight 中没有 UpdateTarget 方法(据我所知),所以这就是提出这个问题的原因。

【问题讨论】:

    标签: silverlight xaml data-binding mvvm


    【解决方案1】:

    如果我理解正确,当属性更改时,您应该将 SelectedItem 支持字段的先前值存储在视图模型的属性上,并且当用户决定取消确认对话框时,您应该恢复SelectedItem 支持字段到前一个值。

    如果您为支持字段使用常规属性,您可以编写一个实现此行为的 Set 方法:

        private object selectedItemPreviousValue;
        private object selectedItemBackingField;
        public object SelectedItemBackingField
        {
            get
            {
                return selectedItemBackingField;
            }
            set
            {
                selectedItemPreviousValue = selectedItemBackingField;
                selectedItemBackingField = value;
            }
        }
    

    如果您使用依赖属性,则必须提供带有 DependencyPropertyChantged 回调的 PropertyMetada,如下所示:

    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;
        }
    

    【讨论】:

    • 是的,我最终这样做了。但是我希望有人告诉我如何更新手头有 BindingExpression 对象的绑定的目标端。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多