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

C# 静态资源转换器上的属性未绑定,c#,.net,wpf,C#,.net,Wpf,我有一个值转换器,它有一个我想绑定的属性,但绑定从未发生过,即我的值转换器中的依赖属性总是null 背景:我想将枚举绑定到组合框,但可以控制正在显示的文本 我实现了如下值转换器: public class EnumDisplayer : DependencyObject, IValueConverter { public static readonly DependencyProperty LocalizerProperty = DependencyProperty.Re

我有一个值转换器,它有一个我想绑定的属性,但绑定从未发生过,即我的值转换器中的依赖属性总是
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>
我把它绑成这样:

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>

我的班级是《圣经》的改编版


我不明白为什么从未调用
onLocalizedChanged
。有人能提供一些见解吗?

我认为这可能是因为您在其中创建实例的
ResourceDictionary
不是可视化树的一部分,因此它找不到
DataContext
,因此
绑定总是返回null

您可以通过给
UserControl
一个
x:Name
属性,然后使用
ElementName
DataContext进行绑定来解决这个问题。PropertyName

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

我认为这可能是因为您在其中创建实例的
ResourceDictionary
不是可视化树的一部分,因此它找不到
DataContext
,因此
绑定总是返回null

您可以通过给
UserControl
一个
x:Name
属性,然后使用
ElementName
DataContext进行绑定来解决这个问题。PropertyName

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

(如果我错了,堆栈团队会纠正我)<代码>值转换器
不自动支持in-binding,原因如下

  • 它们并不是WPF框架主动意识到的东西,因为它们不在视觉或逻辑树上

  • 它们用作内部标记扩展的一部分。这是一个阴暗的地区。除非他们自己实现marrkup扩展,否则他们将受到约束

  • 虽然有办法

  • 简单的方法是使用
    多绑定
    而不是单绑定。第二个绑定将取代转换器托管Dependency属性的需要

  • 我希望这有帮助。

    (如果我错了,堆栈团队会纠正我)<代码>值转换器
    不自动支持in-binding,原因如下

  • 它们并不是WPF框架主动意识到的东西,因为它们不在视觉或逻辑树上

  • 它们用作内部标记扩展的一部分。这是一个阴暗的地区。除非他们自己实现marrkup扩展,否则他们将受到约束

  • 虽然有办法

  • 简单的方法是使用
    多绑定
    而不是单绑定。第二个绑定将取代转换器托管Dependency属性的需要


  • 我希望这有帮助。

    好主意,但这没有帮助。好主意,但这没有帮助。你是对的,看起来我无法像我认为的那样绑定到转换器。我开始怀疑这是否是正确的方法?我认为最好将所有这些工作都放在ViewModel中:我给ViewModel一个列表,其中包含要在combobox中显示的字符串,并且当前为枚举的属性将更改为字符串。所有这些字符串都将由定位器生成。你是对的,看起来我不能像我想的那样绑定到转换器。我开始怀疑这是否是正确的方法?我认为最好将所有这些工作都放在ViewModel中:我给ViewModel一个列表,其中包含要在combobox中显示的字符串,并且当前为枚举的属性将更改为字符串。所有这些字符串都将由定位器生成。