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

时间:2018-05-10 18:56:25

标签: c# wpf commandparameter 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 个答案:

答案 0 :(得分:3)

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

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

  

WPF中的样式和模板提供了以直接方式重用和重新应用内容的功能。但是,样式和模板可能还包含在模板级别定义的具有XAML名称的元素。可以在页面中多次使用相同的模板。因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关。

完整的文章深入探讨了在常规名称范围内如何解析名称的详细信息,以及嵌套范围,包括样式和模板中的范围。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

它没有,所以我不相信这有效。

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