【问题标题】:DependencyObject's binding contextDependencyObject 的绑定上下文
【发布时间】:2012-06-22 15:54:02
【问题描述】:

我正在尝试了解 Silverlight 依赖属性系统的低级细节。

我意识到 DependencyObject 没有明确的 DataContext 属性,甚至没有父级的概念。

但是,从 DependencyObject 派生的 Behavior 类具有绑定,使用它所附加的 DataContext 作为自身绑定的源。

我的问题是:我可以从 DependencyObject 派生一个类并以某种方式确定要在 Source 处使用哪个其他对象进行绑定吗?或者更清楚:如何实现 Behavior 类之类的东西?

【问题讨论】:

    标签: silverlight binding dependency-properties dependencyobject


    【解决方案1】:

    DataContext 是一个 FrameworkElement 属性。通过使用一种形式 父子属性继承,绑定系统可以解析一个 存在于父元素上的 DataContext,即使是子对象 (具有目标属性)不是 FrameworkElement 并且 因此不拥有自己的 DataContext 值。然而,那 父元素必须是 FrameworkElement 才能设置和保存 数据上下文。或者,您必须定义绑定,使其 可以使用 null DataContext。

    从 Silverlight 4 开始,目标也可以是 DependencyObject 在以下情况下的 DependencyProperty:

    • DependencyObject 是 FrameworkElement 的属性值。

    • DependencyObject 位于一个集合中,该集合是 FrameworkElement 属性(例如 Resources 属性)。

    • DependencyObject 位于 DependencyObjectCollection 中。

    从 Silverlight 5 开始,目标也可以是 Value 属性 样式中的 Setter。例如,请参阅 Style 类 概述。

    所以您的问题的答案是:是的,您可以从 DependencyObject 派生您的类,只要满足上面列出的条件或绑定不依赖 DataContext(使用 ElementName 或 Source 属性),其依赖属性的绑定就会起作用

    【讨论】:

    • 还有一点:在我将自定义 DependencyObjectCollection 附加到 FrameworkElement 并在其中插入 DependencyObject 的测试中,它确实 - 与 ResourceDictionary 行为相反 - 没有继承绑定的 DataContext。这应该有效还是有另一种方法可以将继承 DataContext 的 DependencyObjects 附加到现有的 FrameworkElements?或者换一种说法,正如我在最初的问题中所问的那样:我可以重新实现 Behavior 类吗?
    • 我不知道行为究竟是如何做到的,但因为它们存在,所以可以做到。出于好奇,为什么要尝试重新实现 Behavior 类?为什么不直接使用 Microsoft 提供的行为?
    • 您的意思是 Behavior 类是表达式混合库的一部分,而不是核心,对吧?至于为什么不使用行为:我只是提出它们来明确我的问题,我的真正意图只是了解什么是可能的,什么是不可能的。
    • 我查看了行为实现,它非常简单。附加属性 Behaviors 包含从 DependencyObjectCollection 派生的 BehaviorsCollection。 DataContext 继承链为:FrameworkElement-> DependencyObjectCollection -> Behavior。 DataContext 解析不需要额外的代码。
    • 这是我尚未完成的第一步(FrameworkElement-> DependencyObjectCollection)。集合不能是 FrameworkElement 的直接 DependencyProperty。我想它也不在资源部分。那么继承是什么呢?
    猜你喜欢
    • 2016-08-02
    • 2017-10-30
    • 2022-01-09
    • 2012-07-11
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多