静态资源转换器上的属性未绑定

时间:2011-09-22 11:43:04

标签: c# .net wpf

我有一个带有我想要绑定的属性的值转换器,但绑定永远不会发生,即我的值转换器中的依赖属性始终为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。任何人都可以提供一些见解吗?

2 个答案:

答案 0 :(得分:1)

(如果我错了,Stack Team会纠正我)... ValueConverters不会自动支持绑定,而且有原因......

  1. 它们实际上并不是WPF框架积极意识到的,因为它们不会出现在视觉或逻辑树上。

  2. 它们用作内部标记扩展的一部分。这是一个merky地区。除非他们自己实施marrkup扩展,否则他们将被绑定。

  3. 虽然有办法......

    1. 直截了当的方法是使用MultiBinding而不是单一绑定。第二个绑定将取代您的转换器托管依赖属性的需要。

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

    3. 我希望这会有所帮助。

答案 1 :(得分:0)

我认为这可能是因为您在其中创建实例的ResourceDictionary不是可视树的一部分,因此无法找到DataContext,因此Binding始终返回空。

您可以通过提供UserControl x:Name属性,然后使用ElementNameDataContext.PropertyName绑定来解决此问题:

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