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,原因如下
多绑定
而不是单绑定。第二个绑定将取代转换器托管Dependency属性的需要我希望这有帮助。好主意,但这没有帮助。好主意,但这没有帮助。你是对的,看起来我无法像我认为的那样绑定到转换器。我开始怀疑这是否是正确的方法?我认为最好将所有这些工作都放在ViewModel中:我给ViewModel一个列表,其中包含要在combobox中显示的字符串,并且当前为枚举的属性将更改为字符串。所有这些字符串都将由定位器生成。你是对的,看起来我不能像我想的那样绑定到转换器。我开始怀疑这是否是正确的方法?我认为最好将所有这些工作都放在ViewModel中:我给ViewModel一个列表,其中包含要在combobox中显示的字符串,并且当前为枚举的属性将更改为字符串。所有这些字符串都将由定位器生成。