2011-04-07 62 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