2011-09-22 80 views
1

我有一個值轉換器,我想綁定一個屬性,但綁定永遠不會發生,即我的值轉換器中的依賴項屬性始終爲null
背景:我想將一個枚舉綁定到組合框,但是可以控制正在顯示的文本。無法綁定的靜態資源轉換器上的屬性

我實現價值轉換器是這樣的:

public class EnumDisplayer : DependencyObject, IValueConverter 
{ 
    public static readonly DependencyProperty LocalizerProperty = 
     DependencyProperty.Register(
      "Localizer", typeof(ILocalizer), typeof(EnumDisplayer), 
      new PropertyMetadata(default(ILocalizer), OnLocalizerChanged)); 

    public ILocalizer Localizer 
    { 
     get { return (ILocalizer) GetValue(LocalizerProperty); } 
     set { SetValue(LocalizerProperty, value); } 
    } 

    private static void OnLocalizerChanged(DependencyObject d, 
              DependencyPropertyChangedEventArgs e) 
    { 
     // ... 
    } 

    //... 
} 

我將它綁定這樣的:

<UserControl.Resources> 
    <Common:EnumDisplayer x:Key="companyTypes" 
          Localizer="{Binding CompanyTypeEnumLocalizer}" /> 
    <!-- ... --> 
</UserControl.Resources> 

我的階級是EnumDisplayer改編版。

我不明白,爲什麼OnLocalizerChanged永遠不會被調用。誰能提供一些見解?

回答

1

(堆棧團隊糾正我,如果我錯了)... ValueConverters不在結合自動支持和有原因......

  1. 他們arent真正的東西,WPF框架是積極知道,因爲他們不躺在視覺或邏輯樹上。

  2. 它們被用作內部標記擴展的一部分。這是一個merky區域。除非他們自己實施marrkup擴展,否則他們會被綁定。

雖然有辦法..

  1. 簡單的方法是使用MultiBinding,而不是單一的結合。第二個綁定將取代您的轉換器需要託管一個依賴屬性。

  2. http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx

我希望這有助於。

+0

你是對的,它看起來像我不能像我想的那樣綁定到轉換器。我開始懷疑這是否正確?我認爲將所有這些工作放在ViewModel中可能會更好:我給ViewModel一個列表,其中包含要在組合框中顯示的字符串,並且當前是枚舉的屬性將更改爲字符串。所有這些字符串將由本地化器生成。 –

0

我認爲這可能是因爲您在其中創建實例的ResourceDictionary不是可視樹的一部分,所以它找不到DataContextBinding因此始終返回空值。

您可以通過給你的UserControlx:Name屬性,然後使用ElementNameDataContext.PropertyName結合來解決這個問題:

<UserControl x:Name="Root"> 
    <UserControl.Resouces> 
     <Common:EnumDisplayer x:Key="companyTypes" 
         Localizer="{Binding DataContext.CompanyTypeEnumLocalizer, ElementName=Root}" /> 
    </UserControl.Resouces> 
</UserControl> 
+0

好主意,但這並沒有幫助。 –