如何更新绑定的自定义依赖项属性的源?

时间:2011-04-07 16:09:12

标签: wpf xaml binding dependency-properties

我有一个自定义DepenencyProperty,用于确定UserControl的可见性。它通常绑定到一个布尔值,但我想在Escape键被命中时将其设置为False。

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

例如,使用此XAML

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

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

2 个答案:

答案 0 :(得分:5)

这应该可以通过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);

答案 1 :(得分:5)

WPF 4?使用SetCurrentValue

this.SetCurrentValue(IsControlVisibleProperty, false);

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