【问题标题】:How can I update the source of a bound custom dependency property?如何更新绑定的自定义依赖属性的来源?
【发布时间】:2011-07-31 20:17:56
【问题描述】:

我有一个自定义的 DepenencyProperty,它决定了 UserControl 的可见性。它通常绑定到一个布尔值,但是我想在按下 Escape 键时将其设置为 False。

问题是,我不想覆盖绑定,我想更新绑定源值。我怎样才能在后面的代码中做到这一点?

例如,使用此 XAML

<local:MyControl IsVisibile="{Binding IsControlVisible}" />

我想将IsControlVisible 的值更新为false,而不是MyControl.IsVisible

【问题讨论】:

    标签: wpf xaml binding dependency-properties


    【解决方案1】:

    这应该可以通过BindingExpressions 实现,试试这样:

    private void MyControl_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
        {
            var source = sender as FrameworkElement;
            var expression = source.GetBindingExpression(UIElement.IsVisibleProperty);
            (expression.DataItem as MyDataItem).IsControlVisible = false;
        }
    }
    

    (如果你不重复使用UIElement.IsVisibleProperty,你当然需要通过MyControl.IsVisibleProperty来指定它)


    这是一种使用反射的方法:

    var source = sender as FrameworkElement;
    var expression = source.GetBindingExpression(UIElement.IsVisibleProperty);
    var dataType = expression.DataItem.GetType();
    dataType.GetProperties().Single(x => x.Name == expression.ParentBinding.Path.Path)
            .SetValue(expression.DataItem, false, null);
    

    【讨论】:

    • MyDataItem 类不是静态类,所以我认为这行不通。多个 ViewModel 包含这种类型的控件,每个都使用不同的布尔值来确定可见性。
    • MyDataItem 不应该是一个静态类,这只是对你的对象的强制转换,它拥有属性IsControlVisible
    • @HB 我不能这样做,因为我不知道 Visibility 绑定到哪个类,甚至不知道布尔属性被称为什么。 ViewModelA 可能包含此 UserControl 并绑定到属性 ViewModelA.IsControlVisible,而 ViewModelB 可能绑定到 ViewModelB.CanEdit
    • 呸...无论如何,我添加了一个方法,希望对你的情况有效。
    【解决方案2】:

    WPF 4?使用SetCurrentValue:

    this.SetCurrentValue(IsControlVisibleProperty, false);
    

    不会覆盖绑定,而是将false 推送到绑定源。

    【讨论】:

    • 那行不通。看起来它用false替换了属性上的Binding,所以我失去了绑定
    • 您确定您使用的是SetCurrentValue 而不是SetValue
    • 刚刚注意到使用这个方法的时候,Binding的模式要设置为TwoWay。否则源不会改变。
    • @HB 是的,我使用的是 SetCurrentValue。 BindingMode 保留为默认值,我不确定它是默认为 OneWay 还是 TwoWay
    • @Kent Boogaart - SetCurrentValue 在 WPF 3.5 中不存在。除了在 WPF 3.5 中丢失绑定并同时更新目标之外,还有其他选择吗?
    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2011-12-18
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多