C# WPF如何解决相同的ElementName问题?
假设以下HierarchycalDataTemplate显示2个数据集。 然后有两个具有相同x:Name=“MyListBoxName”的列表框。 WPF如何知道作为CommandParameter传递哪个参数C# WPF如何解决相同的ElementName问题?,c#,wpf,commandparameter,elementname,C#,Wpf,Commandparameter,Elementname,假设以下HierarchycalDataTemplate显示2个数据集。 然后有两个具有相同x:Name=“MyListBoxName”的列表框。 WPF如何知道作为CommandParameter传递哪个参数 <HierarchicalDataTemplate ItemsSource="{Binding SubNodes}"> <ListBox x:Name="MyListBoxName"> <i:Interaction.Triggers&
<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元素作为参数传递给datacontext?
我猜你可以做你想做的事,但你只需要换一种方式来思考。事实并非如此,因此我不相信这是可行的 为什么要将UI元素作为参数传递给datacontext?
我猜你可以做你想做的事情,但只需要换一种方式来思考。WPF在解析名称时使用类似于冒泡事件的东西 由于它在其直接父模板中找到名为
MyListBoxName
的元素,因此将使用该元素
如果没有,它将尝试在父模板的父模板中找到它,以此类推
这就是为什么在您的例子中,它可以完美地编译和工作,但如果您尝试在同一模板中添加重复的名称,它就会失败。WPF在解析名称时使用类似于冒泡事件的东西 由于它在其直接父模板中找到名为
MyListBoxName
的元素,因此将使用该元素
如果没有,它将尝试在父模板的父模板中找到它,以此类推
这就是为什么在您的例子中,它可以完美地编译和工作,但如果您尝试在WPF使用的同一模板中添加重复的名称,并将其添加到可能发生冲突的分区名称中,它就会失败
正如可视化树包含元素树一样,也有一个从可视化树构建的名称范围树,它定义了命名元素的层次结构。它可以防止同一范围内的冲突,并允许在嵌套范围内搜索命名元素
WPF中的样式和模板提供了以简单的方式重用和重新应用内容的能力。但是,样式和模板也可能包含在模板级别定义了XAML名称的元素。同一个模板可能在一个页面中使用多次。因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关
整篇文章深入探讨了如何在常规名称作用域和嵌套作用域(包括样式和模板中的作用域)中解析名称的细节。WPF用于在可能发生冲突的位置对名称进行分区
正如可视化树包含元素树一样,也有一个从可视化树构建的名称范围树,它定义了命名元素的层次结构。它可以防止同一范围内的冲突,并允许在嵌套范围内搜索命名元素
WPF中的样式和模板提供了以简单的方式重用和重新应用内容的能力。但是,样式和模板也可能包含在模板级别定义了XAML名称的元素。同一个模板可能在一个页面中使用多次。因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关
整篇文章深入探讨了如何在常规名称作用域和嵌套作用域(包括样式和模板中的作用域)中解析名称的细节。这确实让我感到惊讶:-D我试图完成一个场景,其中我有多个列表框。但只有一个应该有一个选定的项目。这很有趣。我一直避免使用您发布的代码,因为它似乎不起作用。下一次面对这种情况时,我将不得不尝试它。我甚至感到惊讶:-D我正在尝试完成一个场景,其中我有多个列表框。但只有一个应该有一个选定的项目。这很有趣。我一直避免使用您发布的代码,因为它似乎不起作用。下次我遇到这种情况时,我必须尝试一下。