我有一个自定义DepenencyProperty,用于确定UserControl的可见性。它通常绑定到一个布尔值,但我想在Escape键被命中时将其设置为False。
问题是,我不想覆盖绑定,我想更新绑定源值。我怎么能在后面的代码中做到这一点?
例如,使用此XAML
<local:MyControl IsVisibile="{Binding IsControlVisible}" />
我想将IsControlVisible
的值更新为false,而不是MyControl.IsVisible
答案 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
推送到绑定源。