【问题标题】:Bind DataContext to Resource将 DataContext 绑定到资源
【发布时间】:2015-04-24 07:26:38
【问题描述】:

我正在尝试将 DataContext 绑定到我的资源中的某个元素。资源嵌入在通过 DataTemplate 创建的 ContentControl 中,并且已经设置了 DataContext。这个 DataContext 有一个 StatusController(属性名:Status)我想附加到 StatusControllerViewModel,它将属性和事件从 StatusController 转换为 View 符合属性:

  <ContentControl.Resources>     
    <CSharp:StatusControllerViewModel DataContext="{Binding Status}" x:Key="StatusViewModel"/>
</ContentControl.Resources>

问题是出现了这条消息:

找不到管理 FrameworkElement 或 FrameworkContentElement 的 目标元素

StatusControllerViewModel 派生自 DependencyObject,并有一个名为 DataContext 的 DependencyProperty。

从 Freezable 派生它时它可以工作,为什么?

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

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

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

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

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 2011-02-28
      • 1970-01-01
      • 2011-05-19
      • 2016-09-06
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多