WPF 如何解决相同的 ElementName 问题?

How does WPF solve same ElementName issues?

假设以下 HierarchicalDataTemplate 显示 2 个数据集。 然后有 2 个具有相同 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>

谢谢:)

它没有,所以我不相信这行得通。

为什么要将 UI 元素作为参数传递给数据上下文? 我猜你可以做你想做的事,但只需要以不同的方式思考它。

WPF 在解析名称时使用类似于冒泡事件的方法。

因为它在其直接父模板中找到名称为 MyListBoxName 的元素,所以它将使用该元素。

如果没有,它将尝试在父模板的父模板中找到它,依此类推。

这就是为什么在您的情况下它可以完美编译和工作,但如果您尝试在同一模板中添加重复的名称就会失败

WPF 使用 Namescopes 对可能存在冲突的名称进行分区。

正如可视化树包含元素树一样,有一个名称范围树是从可视化树构建的,它定义了命名元素的层次结构。它可以防止同一范围内的冲突,并允许在嵌套范围内搜索命名元素。

Styles and templates in WPF provide the ability to reuse and reapply content in a straightforward way. However, styles and templates might also include elements with XAML names defined at the template level. That same template might be used multiple times in a page. For this reason, styles and templates both define their own XAML namescopes, independent of whatever location in an object tree where the style or template is applied.

整篇文章非常深入地详细介绍了如何在常规名称范围和嵌套范围(包括样式和模板中的名称)中解析名称。