Как WPF решает те же проблемы ElementName?

Скажем, следующий HierarchicalDataTemplate отображает 2 набора данных. Тогда есть 2 ListBox с тем же x:Name ="MyListBoxName". Как WPF знает, какой передать как CommandParameter????

<HierarchicalDataTemplate ItemsSource="{Binding SubNodes}">
      <ListBox x:Name="MyListBoxName">
      <i:Interaction.Triggers>
       <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}, Path=DataContext.SelectedCommand}" CommandParameter="{Binding ElementName=MyListBoxName}"/>
       </i:EventTrigger>
      </i:Interaction.Triggers>
    </HierarchicalDataTemplate>

Спасибо:)

3 ответа

Решение

WPF использует нечто похожее на всплывающее событие при разрешении имени.

Так как он находит элемент с именем MyListBoxName в своем непосредственном родительском шаблоне он будет использовать этот.

Если нет, он попытается найти его в родительском шаблоне родительского шаблона и так далее.

Вот почему в вашем случае он компилируется и работает отлично, но не работает, если вы пытаетесь добавить дублированное имя в тот же шаблон

WPF использует Namescopes для разбиения имен, где могут быть конфликты.

Так же, как визуальное дерево содержит дерево элементов, существует дерево имен, построенное из визуального дерева, которое определяет иерархию именованных элементов. Это предотвращает столкновения в пределах одной и той же области и позволяет искать во вложенных областях именованные элементы.

Стили и шаблоны в WPF предоставляют возможность повторного использования и повторного применения контента простым способом. Однако стили и шаблоны могут также включать элементы с именами XAML, определенными на уровне шаблона. Один и тот же шаблон может использоваться на странице несколько раз. По этой причине стили и шаблоны определяют свои собственные области имен XAML, независимо от того, какое место в дереве объектов применяется к стилю или шаблону.

В полной статье подробно рассматриваются способы разрешения имен в обычных именных областях и вложенных областях, в том числе в стилях и шаблонах.

Это не так, поэтому я не верю, что это работает.

Почему вы передаете элемент пользовательского интерфейса в качестве параметра к текстовому тексту в любом случае? Я предполагаю, что вы можете делать то, что вы хотите, но просто нужно думать об этом по-другому.

Другие вопросы по тегам