0

假设以下 HierarchicalDataTemplate 显示 2 个数据集。然后有 2 个具有相同 x:Name ="MyListBoxName" 的 ListBox。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>

谢谢 :)

4

3 回答 3

3

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

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

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

整篇文章深入探讨了如何在常规名称范围和嵌套范围内解析名称的细节,包括样式和模板中的那些。

于 2018-05-10T19:29:18.567 回答
1

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

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

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

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

于 2018-05-10T19:26:14.983 回答
0

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

你为什么要将 UI 元素作为参数传递给 datacontext 呢?我猜你可以做你想做的事,但只需要换个角度思考。

于 2018-05-10T19:03:01.450 回答