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.
整篇文章非常深入地详细介绍了如何在常规名称范围和嵌套范围(包括样式和模板中的名称)中解析名称。
假设以下 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.
整篇文章非常深入地详细介绍了如何在常规名称范围和嵌套范围(包括样式和模板中的名称)中解析名称。