UIElement
上的依赖属性不支持数据绑定(你会得到类似的东西:
"找不到治理 框架元素..")
.如果尝试,则会收到错误,因为 WPF 无法解析数据上下文。据我所知,如果您继承 FrameworkElement 或 Freezable,您将获得绑定支持,但在这种情况下,我不能简单地更改基类。有没有办法让 UIElement 支持数据绑定?
我尝试将 DataContext 属性添加到 UIElement 类中,如下所示:
FrameworkElement.DataContextProperty.AddOwner(typeof(Bitmap), new
FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));
我还尝试通过在绑定表达式中指定"ElementName"来绑定,但我仍然无法解析父 DataContext(我认为通过 ElementName 显式绑定只会消除解析 DataContext 的需要)。
这是绑定。有问题的类称为"位图"。
<Utils:Bitmap Source="{Binding Path=Icon}" />
<TextBlock Grid.Row="1" Grid.ColumnSpan="3" MaxWidth="90" Text="{Binding Path=Name}" TextWrapping="Wrap" TextAlignment="Center"/>
文本块绑定按预期工作,第一个绑定不工作。绑定视图模型具有这两个属性(我之前绑定到 Image 类并且它起作用了)。
位图类可以在以下博客中找到:http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx
通过一些扩展的绑定诊断,我得到以下输出:
System.Windows.Data Warning: 65 : BindingExpression (hash=14926099): Framework mentor not found
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Icon; DataItem=null; target element is 'Bitmap' (HashCode=117163); target property is 'Source' (type 'BitmapSource')
System.Windows.Data Warning: 63 : BindingExpression (hash=6195855): Resolving source (last chance)
System.Windows.Data Warning: 65 : BindingExpression (hash=6195855): Framework mentor not found
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Icon; DataItem=null; target element is 'Bitmap' (HashCode=55762700); target property is 'Source' (type 'BitmapSource')
System.Windows.Data Warning: 63 : BindingExpression (hash=48657561): Resolving source (last chance)
System.Windows.Data Warning: 65 : BindingExpression (hash=48657561): Framework mentor not found
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Icon; DataItem=null; target element is 'Bitmap' (HashCode=35264868); target property is 'Source' (type 'BitmapSource')
必须继承FrameworkElement
才能使用数据绑定。如果无法更改基类,则唯一的选择是,如 H.B. 所说,创建一个将从 FrameworkElement
派生的适配器,并将所有功能委托给派生自 UIElement
的现有类的实例。
有关基本框架类(如 UIElement
和 FrameworkElement
)提供的内容的更多信息,请参阅 http://msdn.microsoft.com/en-us/library/ms743618.aspx。
更新:
尽管 MSDN(上面的链接)说数据绑定支持是在FrameworkElement
级别引入的,但可以在任何DependencyObject
上设置绑定。唯一的问题是,在这种情况下,不能使用 DataContext
作为绑定的隐式源,也不能使用 ElementName
来引用源。
您可以做的是以编程方式设置绑定并显式指定源:
BindingOperations.SetBinding(MyBitmap, Bitmap.IconProperty, new Binding() { Source = this.DataContext /* Or any other source */, Path = new PropertyPath("Icon")});
或者您可以使用一些技巧并使用RelativeSource
来引用可视化树中的元素(在本例中为任何父FrameworkElement
):
<Utils:Bitmap Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FrameworkElement}}, Path=DataContext.Icon}" />
{Binding Source={x:Reference elementName}}
而不是{Binding ElementName=elementName}
。
前所述,你可以绑定到任何继承自DependencyObject
的对象,如果你想要一个DataContext
,我建议你只让类继承自FrameworkElement
。即使像 Rectangle 这样的形状也会这样做,如果你有一些图像控件,那么选择更高级别作为基类才有意义。