我有一个带有我想要绑定的属性的值转换器,但绑定永远不会发生,即我的值转换器中的依赖属性始终为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
。任何人都可以提供一些见解吗?
答案 0 :(得分:1)
(如果我错了,Stack Team会纠正我)... ValueConverters
不会自动支持绑定,而且有原因......
它们实际上并不是WPF框架积极意识到的,因为它们不会出现在视觉或逻辑树上。
它们用作内部标记扩展的一部分。这是一个merky地区。除非他们自己实施marrkup扩展,否则他们将被绑定。
虽然有办法......
直截了当的方法是使用MultiBinding
而不是单一绑定。第二个绑定将取代您的转换器托管依赖属性的需要。
http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx
我希望这会有所帮助。
答案 1 :(得分:0)
我认为这可能是因为您在其中创建实例的ResourceDictionary
不是可视树的一部分,因此无法找到DataContext
,因此Binding
始终返回空。
您可以通过提供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>