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
属性的值?
答案 0 :(得分:6)
您向后阅读:您无法将附加属性应用于非DependencyObject
。但是,您可以定义不是从DependencyObject
派生的类的附加属性。通常是静态类,如WPF中的FocusManager
。
x:Name
不是附加属性:它是directive。在FrameworkElement
的常见情况下,它与FrameworkElement.Name
相同。对于自定义类,其目的是定义同名字段(应该是您的情况:您现在可以从代码隐藏中获得Refresh
和Print
个字段)。在每种情况下(ResourceDictionary
内除外),它都会添加到当前XAML namescope。
您可以在Window
上使用FindName从其名称获取命令绑定。如果您确实需要从对象中获取名称,则可以使用以下代码来获取包含范围中每个命名元素的可枚举字典:
var dictionary = (INameScopeDictionary) NameScope.GetNameScope(yourWindow);