Чтение вложенного свойства из Non-DependencyObject - PullRequest
2 голосов
/ 26 июня 2011

XAML позволяет мне прикреплять свойства к типам, которые не являются производными от DependencyObject.Например, я мог бы дать имена CommandBindings в окне:

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

Я обнаружил упоминание об этой возможности в MSDN ( Обзор вложенных свойств ), в котором говорится " Есливаш класс определяет присоединенное свойство строго для использования в других типах, тогда класс не обязательно должен быть производным от DependencyObject, но вам нужно наследовать от DependencyObject, если вы следуете общей модели WPF, в которой ваше присоединенное свойство также является свойством зависимости."- но я понятия не имею, как получить эти присоединенные свойства в коде.

Учитывая приведенный выше код XAML, вставленный в <Window />, как я могу получить значения свойств x:Nameот каждого CommandBinding?

1 Ответ

6 голосов
/ 26 июня 2011

Вы читаете это задом наперед: вы не можете применить прикрепленное свойство к не-DependencyObject.Однако вы можете определить присоединенное свойство для класса, не производного от DependencyObject.Обычно статический класс, такой как FocusManager в WPF.

x:Name, не является присоединенным свойством: это директива .В обычном случае FrameworkElement это то же самое, что и FrameworkElement.Name.В случае пользовательского класса его целью является определение поля с тем же именем (что и должно быть в вашем случае: теперь у вас есть поля Refresh и Print, доступные из кода кода).В каждом случае (кроме ResourceDictionary) он добавляется к текущему XAML-имени .

. Вы можете использовать FindName на вашем Window, чтобы получитьпривязка команды от ее имени.Если вам действительно нужно вернуть имя из объекта, вы можете использовать следующий фрагмент кода, чтобы получить перечислимый словарь, содержащий каждый именованный элемент в области видимости:

var dictionary = (INameScopeDictionary) NameScope.GetNameScope(yourWindow);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...