2011-04-07 40 views
1

我有一个自定义的DepenencyProperty,它决定了UserControl的可见性。它通常绑定到一个布尔值,但是我想在Escape键被击中时将其设置为False。如何更新绑定的自定义依赖项属性的来源?

问题是,我不想覆盖绑定,我想更新绑定源值。我如何在代码背后做到这一点?

例如,与此XAML

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

我想更新的IsControlVisible假的价值,而不是MyControl.IsVisible

回答

4

这应该通过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指定它当然


这里是一个使用反射法:

+0

“MyDataItem”类不是静态类,所以我不认为这会起作用。多个ViewModel包含这种类型的控件,每个控件都使用不同的布尔值来确定可见性。 – Rachel 2011-04-07 16:15:41

+0

'MyDataItem'不应该是一个静态类,这只是对你的对象持有属性'IsControlVisible'的强制转换。 – 2011-04-07 16:18:00

+0

@HB我不能这样做,因为我不知道可见性绑定了什么类,甚至是什么布尔属性被调用。 ViewModelA可能包含此UserControl并绑定到属性'ViewModelA.IsControlVisible',而ViewModelB可能绑定到'ViewModelB.CanEdit' – Rachel 2011-04-07 16:24:16

4

WPF 4?使用SetCurrentValue

this.SetCurrentValue(IsControlVisibleProperty, false); 

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

+0

这是行不通的。它看起来像用'false'替换属性上的绑定,所以我失去了绑定 – Rachel 2011-04-07 17:43:17

+0

你确定使用了'SetCurrentValue'而不是'SetValue'吗? – 2011-04-07 19:14:16

+0

刚注意到使用这种方法时,Binding的模式应该设置为'TwoWay'。否则,来源不会被更改。 – 2011-04-07 19:30:05