我试图将DataContext绑定到我的资源中的某个元素。资源嵌入在通过DataTemplate创建的ContentControl中,并且已经设置了DataContext。这个DataContext有一个StatusController(属性名:Status)我想附加到StatusControllerViewModel,它将属性和事件从StatusController转换为View conform属性:
<ContentControl.Resources>
<CSharp:StatusControllerViewModel DataContext="{Binding Status}" x:Key="StatusViewModel"/>
</ContentControl.Resources>
问题在于此消息显示:
无法找到管理FrameworkElement或FrameworkContentElement 目标要素
StatusControllerViewModel派生自DependencyObject,并具有名为DataContext的DependencyProperty。
从Freezable派生时,它有效,为什么?
答案 0 :(得分:1)
您的问题的原因取决于WPF不知道用于获取DataContext的FrameworkElement
是什么,因为您的StatusControllerViewModel
不属于ContentControl的可视或逻辑树(因为它是资源)。
如果你使StatusControllerViewModel
派生自Freezable
- 正如你所说 - 解决了你的问题,因为Freezable对象可以继承DataContext,即使它们不在视觉或逻辑树中。
您可以找到有关Freezable DataContext继承here的完整说明:
通常,[...] DataContext绑定会根据目标进行解析 依赖对象在元素树(或名称范围)中的位置 目标依赖项对象所属的目标。但在这种情况下, 目标依赖项对象实际上不在树中。相反,它是 只是另一个对象的属性值。那个其他对象可能或可能 不在树上。
Freezable技巧的工作原因是因为Freezable对象具有 它自己的“继承语境”概念。当属性引擎 设置依赖属性的有效值,它会查看它 确定它是否是依赖对象的新值 喜欢成为特殊继承树的一部分。
我希望它可以帮到你。