如何更新绑定的自定义依赖项属性的来源?
我有一个自定义的DepenencyProperty,它决定了UserControl的可见性。它通常绑定到一个布尔值,但是我想在Escape键被击中时将其设置为False。如何更新绑定的自定义依赖项属性的来源?
问题是,我不想覆盖绑定,我想更新绑定源值。我如何在代码背后做到这一点?
例如,与此XAML
<local:MyControl IsVisibile="{Binding IsControlVisible}" />
我想更新的IsControlVisible
假的价值,而不是MyControl.IsVisible
这应该通过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
您需要通过012指定它当然)
这里是一个使用反射法:
WPF 4?使用SetCurrentValue
:
this.SetCurrentValue(IsControlVisibleProperty, false);
这不会覆盖绑定,而是将推动false
到绑定源。
这是行不通的。它看起来像用'false'替换属性上的绑定,所以我失去了绑定 – Rachel 2011-04-07 17:43:17
你确定使用了'SetCurrentValue'而不是'SetValue'吗? – 2011-04-07 19:14:16
刚注意到使用这种方法时,Binding的模式应该设置为'TwoWay'。否则,来源不会被更改。 – 2011-04-07 19:30:05
“MyDataItem”类不是静态类,所以我不认为这会起作用。多个ViewModel包含这种类型的控件,每个控件都使用不同的布尔值来确定可见性。 – Rachel 2011-04-07 16:15:41
'MyDataItem'不应该是一个静态类,这只是对你的对象持有属性'IsControlVisible'的强制转换。 – 2011-04-07 16:18:00
@HB我不能这样做,因为我不知道可见性绑定了什么类,甚至是什么布尔属性被调用。 ViewModelA可能包含此UserControl并绑定到属性'ViewModelA.IsControlVisible',而ViewModelB可能绑定到'ViewModelB.CanEdit' – Rachel 2011-04-07 16:24:16