2011-09-22 53 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

好主意,但这并没有帮助。 –