3

我已經創建了我的派生AutoCompleteBox控制一個DependencyProperty - > IsReadOnly使用結合一個轉換器,帶一個DependencyProperty

從那裏,我試圖通過轉換器來設定值(T/F)。基於轉換器值,我想更新DependencyProperty的setter中嵌套的TextBox樣式。顯式設置XAML中的屬性(IsReadOnly =「True」)可以正常工作,並且setter觸發並更新樣式。但是,通過轉換器進行此操作不會觸發DependencyProperty的setter。我似乎在這裏有麻煩粘貼代碼段(第一次海報)..所以我會盡我所能,給通過運行一個簡單的代碼:

物業上AutoCompleteBox:

IsReadOnly =「{結合轉換器= {StaticResource IsReadOnlyVerifier},ConverterParameter ='Edit Client'}「

調用轉換器,根據用戶的權限返回true或false。但是,這不會調用註冊的DependencyProperty的setter。

.. 設置

 { 
      if (value) 
      { 
       var style = StyleController.FindResource("ReadOnlyTextBox") as Style; 
       TextBoxStyle = style; 
      } 
      else 
      { 
       TextBoxStyle = null; 
      } 
      SetValue(IsReadOnlyProperty, value); 
     } 

回答

3

這是一個典型的新手疑難雜症。綁定將直接使用SetValue設置目標DependencyProperty,它們不通過POCO屬性設置器方法分配值。

IsReadOnly屬性應該是這樣的: -

#region public bool IsReadOnly 
    public bool IsReadOnly 
    { 
     get { return (bool)GetValue(IsReadOnlyProperty); } 
     set { SetValue(IsReadOnlyProperty, value); } 
    } 

    public static readonly DependencyProperty IsReadOnlyProperty = 
    DependencyProperty.Register(
     "IsReadOnly", 
     typeof(bool), 
     typeof(MyAutoCompleteBox), 
     new PropertyMetaData(false, OnIsReadOnlyPropertyChanged)); 

    private static void OnIsReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     MyAutoCompleteBox source = d as MyAutoCompleteBox; 
     source.OnIsReadOnlyChanged((bool)e.OldValue, (bool)e.NewValue);  
    } 

    private void OnIsReadOnlyChanged(bool oldValue, bool newValue) 
    { 
     TextBoxStyle = newValue ? StyleControlller.FindResource("ReadOnlyTextBox") as Style ? null; 
    } 
    #endregion 

它影響在註冊時DependencyProperty依賴屬性設置你應該提供一個PropertyChangedCallback代表對PropertyMetaData任何其他更改。只要使用SetValue爲此屬性分配一個值,就會調用它。

+0

+1:Classic確實...我們應該有一個剪切/粘貼的答案,因爲這個經常出現:) –

+0

+1:我看到了幾個例子,處理這樣的PropertyChangedEvent ..我想我可以「智能」,只需在DP設置器中執行樣式設置邏輯即可。用查理辛 - 雙贏!謝謝。 –

相關問題