将DataContext绑定到资源

时间:2015-04-24 07:26:38

标签: c# wpf mvvm

我试图将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派生时,它有效,为什么?

1 个答案:

答案 0 :(得分:1)

您的问题的原因取决于WPF不知道用于获取DataContext的FrameworkElement是什么,因为您的StatusControllerViewModel不属于ContentControl的可视或逻辑树(因为它是资源)。

如果你使StatusControllerViewModel派生自Freezable - 正如你所说 - 解决了你的问题,因为Freezable对象可以继承DataContext,即使它们不在视觉或逻辑树中。 您可以找到有关Freezable DataContext继承here的完整说明:

  

通常,[...] DataContext绑定会根据目标进行解析   依赖对象在元素树(或名称范围)中的位置   目标依赖项对象所属的目标。但在这种情况下,   目标依赖项对象实际上不在树中。相反,它是   只是另一个对象的属性值。那个其他对象可能或可能   不在树上。

     

Freezable技巧的工作原因是因为Freezable对象具有   它自己的“继承语境”概念。当属性引擎   设置依赖属性的有效值,它会查看它   确定它是否是依赖对象的新值   喜欢成为特殊继承树的一部分。

我希望它可以帮到你。