从非DependencyObject读取附加属性

时间:2011-06-26 11:02:20

标签: wpf dependency-properties attached-properties

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代码已插入<Window />,如何从每个x:Name检索CommandBinding属性的值?

1 个答案:

答案 0 :(得分:6)

您向后阅读:您无法将附加属性应用于非DependencyObject。但是,您可以定义不是从DependencyObject派生的类的附加属性。通常是静态类,如WPF中的FocusManager

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

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

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