【问题标题】:Reading Attached Property from Non-DependencyObject从非依赖对象读取附加属性
【发布时间】:2011-06-26 11:02:20
【问题描述】:

XAML 允许我将属性附加到不是从 DependencyObject 派生的类型。例如,我可以为 Window 上的 CommandBindings 命名:

<Window.CommandBindings>
  <CommandBinding x:Name="Refresh" Command="NavigationCommands.Refresh" />
  <CommandBinding x:Name="Print" Command="ApplicationCommands.Print" />
</Window.CommandBindings>

我发现在 MSDN (Attached Properties Overview) 上提到了这种可能性,其中指出“如果您的类严格定义附加属性以用于其他类型,则该类不必从 DependencyObject 派生。但是如果您遵循将附加属性也作为依赖属性的整体 WPF 模型,则确实需要从 DependencyObject 派生。“ - 但我不知道如何在代码中获取这些附加属性。

鉴于上述 XAML 代码插入 &lt;Window /&gt;,我如何从每个 CommandBinding 检索 x:Name 属性的值?

【问题讨论】:

    标签: wpf dependency-properties attached-properties


    【解决方案1】:

    您倒着读:您不能将附加属性应用于非DependencyObject。但是,您可以定义一个附加属性,该属性不是从DependencyObject 派生的。通常是静态类,如 WPF 中的FocusManager

    x:Name 不是附加属性:它是directive。在FrameworkElement 的常见情况下,它与FrameworkElement.Name 相同。在自定义类的情况下,它的目的是定义一个同名的字段(这应该是您的情况:您现在可以从代码隐藏中获得 RefreshPrint 字段)。在任何情况下(ResourceDictionary 内除外),它都会添加到当前的 XAML namescope

    您可以在Window 上使用FindName 从其名称中获取命令绑定。如果您确实需要从对象中取回名称,可以使用以下代码来获取包含范围内每个命名元素的可枚举字典:

    var dictionary = (INameScopeDictionary) NameScope.GetNameScope(yourWindow);
    

    【讨论】:

    • 感谢您解决这个问题!我以为这和我写 Grid.Column="1" 的时候是一样的,但显然我完全走错了路:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多