【问题标题】:Check if DataContext is Inherited via code检查 DataContext 是否通过代码继承
【发布时间】:2020-06-07 17:39:49
【问题描述】:

我想通过 C# 代码检查 UserControl 的 DataContext 值是从父元素继承还是直接设置在当前 UserControl(本地值)上.

我可以使用 visual studio wpf 可视化工具找到此信息,但我不知道如何通过代码执行此操作。

我附上了我想要的信息的屏幕截图(黄色突出显示)。

【问题讨论】:

  • 问题不明确。您能否举例说明用户控件在哪里不 继承 FrameworkElement 并从中获取 DataContext 属性? |这样做听起来像是在尝试制作 Windows 窗体,而不是从 Form 类继承。
  • 与任何其他依赖属性一样,DataContext 可以有多个来源,即本地值、来自样式或动画的值、默认值等。此外,它还可以通过属性值继承来获取其值。问题:找出值的来源。见Dependency Property Value Precedence。

标签: c# wpf datacontext


【解决方案1】:

使用 DependencyPropertyHelper:

var helper = DependencyPropertyHelper.GetValueSource(
    control,
    FrameworkElement.DataContextProperty);

Debug.WriteLine(helper.BaseValueSource);

BaseValueSource 的类型是以下枚举(来自.NET Reference Source):

public enum BaseValueSource
{
    /// <summary> The source is not known by the Framework. </summary>
    Unknown                 = BaseValueSourceInternal.Unknown,
    /// <summary> Default value, as defined by property metadata. </summary>
    Default                 = BaseValueSourceInternal.Default,
    /// <summary> Inherited from an ancestor. </summary>
    Inherited               = BaseValueSourceInternal.Inherited,
    /// <summary> Default Style for the current theme. </summary>
    DefaultStyle            = BaseValueSourceInternal.ThemeStyle,
    /// <summary> Trigger in the default Style for the current theme. </summary>
    DefaultStyleTrigger     = BaseValueSourceInternal.ThemeStyleTrigger,
    /// <summary> Style setter. </summary>
    Style                   = BaseValueSourceInternal.Style,
    /// <summary> Trigger in the Template. </summary>
    TemplateTrigger         = BaseValueSourceInternal.TemplateTrigger,
    /// <summary> Trigger in the Style. </summary>
    StyleTrigger            = BaseValueSourceInternal.StyleTrigger,
    /// <summary> Implicit Style reference. </summary>
    ImplicitStyleReference  = BaseValueSourceInternal.ImplicitReference,
    /// <summary> Template that created the element. </summary>
    ParentTemplate          = BaseValueSourceInternal.ParentTemplate,
    /// <summary> Trigger in the Template that created the element. </summary>
    ParentTemplateTrigger   = BaseValueSourceInternal.ParentTemplateTrigger,
    /// <summary> Local value. </summary>
    Local                   = BaseValueSourceInternal.Local,
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多