【问题标题】:Determine if a WPF DependencyProperty value is inherited确定是否继承了 WPF DependencyProperty 值
【发布时间】:2010-10-22 23:21:51
【问题描述】:

有谁知道如何确定 WPF 属性的值是否被继承?特别是,我试图确定 FrameworkElementDataContext 是从父级继承还是直接设置在元素本身上。

【问题讨论】:

    标签: wpf inheritance datacontext dependency-properties


    【解决方案1】:

    更多挖掘后更新

    有一个ReadLocalValue 方法是愚蠢的阅读而不是在智能感知中很难发现。 (我认为 Apress 的 WPF 书中实际上对此有注释。)如果尚未设置该值,它将返回 UnsetValue

    if (ReadLocalValue(Control.DataContextProperty) != 
        DependencyProperty.UnsetValue)
    {
        // Data context was set locally.
    }
    

    如果您出于某种原因需要获取 所有 本地设置的属性,则可以使用 LocalValueEnumerator。

    LocalValueEnumerator enumerator = GetLocalValueEnumerator();
    while (enumerator.MoveNext())
    {
        if (enumerator.Current.Property == Control.DataContextProperty)
        {
            // DataContext was set locally
        }
    }
    

    而这两种方法真的让我很纳闷。在 ReadLocalValue 中读取而不是 Get 以及在 GetLocalValueEnumerator 中无法使用 foreach 迭代的集合。就像 .Net 具有 WPF 团队刚刚决定忽略的这些不错的标准内容。

    【讨论】:

    • 我之前使用ReadLocalValue 来确定是否在自定义Panel 中设置了值。它会导致一些非常奇怪的行为,当某个值被样式应用时,我的面板仍然会认为该值没有设置。只有在调用SetValue 时,面板才会开始按照他们应该的方式概述我的元素,尽管GetValue 确实返回了正确的值。解决此问题的正确方法是按照Kent's answer,它为您提供所有信息,而不仅仅是副作用(本地值)。
    【解决方案2】:

    DependencyPropertyHelper.GetValueSource 会给你一个ValueSource,其中包括一个用于检索BaseValueSource 的属性。 BaseValueSource 枚举告诉您 DependencyProperty 从哪里获取其值,例如从父级继承、通过样式设置或在本地设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2013-11-30
      • 2014-07-04
      • 2013-04-06
      相关资源
      最近更新 更多