查找树型视图从文本菜单绑定项目 [英] Find Bound Item from TreeViewItem from ContextMenu
问题描述
我有这样的树视图,看起来像这样:
< TreeView控件
Grid.Column =0
Grid.Row =2
了minHeight =100
了minWidth =100
BorderBrush =白
的DataContext ={结合项目,源= {X:静态SizingApp:Manager.Instance}}>
< TreeView.Resources>
<风格的TargetType =树型视图>
< setter属性=IsExpandedVALUE =真/>
< /样式和GT;
<的DataTemplate X:键=LoadTemplate>
< TextBlock的文本={绑定名称}>
< TextBlock.ContextMenu>
<&文本菜单GT;
<菜单项InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Edit_InputGestureText}\">
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= load_ContextMenu_Edit_Header}}/>
< /MenuItem.Header>
< /菜单项>
<&菜单项GT;
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= load_ContextMenu_Save_Header}}/>
< /MenuItem.Header>
< /菜单项>
<&菜单项GT;
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= load_ContextMenu_Export_Header}}/>
< /MenuItem.Header>
< /菜单项>
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= load_ContextMenu_Copy_Header}
InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Copy_InputGestureText}\"/>
<菜单项InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Remove_InputGestureText}\">
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= load_ContextMenu_Remove_Header}}/>
< /MenuItem.Header>
< /菜单项>
< /文本菜单>
< /TextBlock.ContextMenu>
< / TextBlock的>
< / DataTemplate中>
< HierarchicalDataTemplate X:键=StepTemplate
的ItemsSource ={结合负载}
的ItemTemplate ={StaticResource的LoadTemplate}>
< TextBlock的文本={绑定名称}>
< TextBlock.ContextMenu>
<&文本菜单GT;
<菜单项InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Edit_InputGestureText}\">
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= step_ContextMenu_Edit_Header}}/>
< /MenuItem.Header>
< /菜单项>
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= step_ContextMenu_Copy_Header}
InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Copy_InputGestureText}\" />
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= step_ContextMenu_Paste_Header}
InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Paste_InputGestureText}\" />
<菜单项标题={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Import_Load_Header}\" />
<&菜单项GT;
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= step_ContextMenu_Export_Header}}/>
< /MenuItem.Header>
< /菜单项>
<菜单项InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Remove_InputGestureText}\">
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= step_ContextMenu_Remove_Header}}/>
< /MenuItem.Header>
< /菜单项>
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= step_ContextMenu_Add_Load_Header}
的ItemsSource ={StaticResource的mnuLoadSubmenuCommon}/>
< /文本菜单>
< /TextBlock.ContextMenu>
< / TextBlock的>
< / HierarchicalDataTemplate>
< HierarchicalDataTemplate X:键=ProjectTemplate
的ItemsSource ={结合步骤}
的ItemTemplate ={StaticResource的StepTemplate}>
< TextBlock的文本={绑定名称}>
< TextBlock.ContextMenu>
<&文本菜单GT;
<菜单项InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Edit_InputGestureText}\"
点击=EditProject_Click>
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= project_ContextMenu_Edit_Header}}/>
< /MenuItem.Header>
< /菜单项>
<&菜单项GT;
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= project_ContextMenu_Save_Header}}/>
< /MenuItem.Header>
< /菜单项>
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= project_ContextMenu_Copy_Header}
InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Copy_InputGestureText}\" />
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= project_ContextMenu_Paste_Header}
InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Paste_InputGestureText}\" />
<菜单项InputGestureText ={RESX ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Remove_InputGestureText}\">
< MenuItem.Header>
< TextBlock的文本={绑定路径=名称,
的StringFormat = {RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= project_ContextMenu_Remove_Header}}/>
< /MenuItem.Header>
< /菜单项>
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= projectTree_Project_AddStep_Header}/>
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= projectTree_Project_ImportStep_Header}/>
< /文本菜单>
< /TextBlock.ContextMenu>
< / TextBlock的>
< / HierarchicalDataTemplate>
< /TreeView.Resources>
<树型视图
标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= projectTree_Header}
的ItemsSource ={结合}
IsExpanded =真
的ItemTemplate ={StaticResource的ProjectTemplate}>
< TreeViewItem.ContextMenu>
<&文本菜单GT;
<菜单项标题={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= projectTree_Paste_Header}
InputGestureText ={RESX ResxName = PSSPECApplication.Controls.ProjectControlResources,重点= projectTree_Paste_InputGestureText}/>
< /文本菜单>
< /TreeViewItem.ContextMenu>
< /树型视图>
< / TreeView的>
这是我的单击事件
私人无效EditProject_Click(对象发件人,RoutedEventArgs E)
{
//我怎么找到这个上下文菜单中驻留的节点的绑定项?
}
我试图写的文本菜单菜单项单击事件EditProject_Click事件。当我点击它,我希望能够找到绑定到上下文菜单所在的节点的项目。我该怎么做呢?
答案
私人无效EditProject_Click(对象发件人,RoutedEventArgs E)
{
项目项目=(项目)((菜单项)发送方).DataContext; //做的东西与项目在这里
}
另外,如果你想获得你的文本菜单来更新它的DataContext从文本菜单是假设连接到的元素,这里是该语法:
<文本菜单的DataContext ={结合PlacementTarget.DataContext,的RelativeSource = {自我的RelativeSource}}>
在单击事件处理程序,将(发件人为FrameworkElement的).DataContext是你在找什么?
编辑:
下面的示例code。
XAML:
<窗口x:类=WpfApplication3.MainWindow
的xmlns =http://schemas.microsoft.com/winfx/2006/xaml/$p$psentation
的xmlns:X =http://schemas.microsoft.com/winfx/2006/xaml
的xmlns:V =CLR的命名空间:WpfApplication3
标题=主窗口HEIGHT =350WIDTH =525>
< Window.Resources>
<的DataTemplate X:键=模板>
< TextBlock的文本={结合}>
< TextBlock.ContextMenu>
<&文本菜单GT;
<菜单项标题=测试点击=MenuItem_Click/>
< /文本菜单>
< /TextBlock.ContextMenu>
< / TextBlock的>
< / DataTemplate中>
< /Window.Resources>
<&DockPanel中GT;
<按钮DockPanel.Dock =评出的点击=Button_Click>变化语境下,/按钮> < TreeView的X:名称=TV的ItemTemplate ={StaticResource的模板}/> < / DockPanel中>< /窗GT;
code-背后:
公共部分类主窗口:窗口
{
布尔标志= FALSE;
公共主窗口()
{
的InitializeComponent();
列表列表=新名单(){A,B,C,D};
this.tv.ItemsSource =清单;
}
私人无效MenuItem_Click(对象发件人,RoutedEventArgs E)
{
MessageBox.Show((发件人为菜单项).DataContext.ToString());
}
私人无效Button_Click(对象发件人,RoutedEventArgs E)
{
如果(标志)
{
列表列表=新名单(){A,B,C,D};
this.tv.ItemsSource =清单;
}
其他
{
列表列表=新列表(){1,2,3,4};
this.tv.ItemsSource =清单;
}
标志=标志!;
}}
I have this Tree View that looks like this:
<TreeView
Grid.Column="0"
Grid.Row="2"
MinHeight="100"
MinWidth="100"
BorderBrush="White"
DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
<DataTemplate x:Key="LoadTemplate">
<TextBlock Text="{Binding Name}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Edit_InputGestureText}">
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Edit_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem>
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Save_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem>
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Export_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Copy_Header}"
InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Copy_InputGestureText}"/>
<MenuItem InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Remove_InputGestureText}">
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=load_ContextMenu_Remove_Header}}" />
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate"
ItemsSource="{Binding Loads}"
ItemTemplate="{StaticResource LoadTemplate}">
<TextBlock Text="{Binding Name}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Edit_InputGestureText}">
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Edit_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Copy_Header}"
InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Copy_InputGestureText}" />
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Paste_Header}"
InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Paste_InputGestureText}" />
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Import_Load_Header}" />
<MenuItem>
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Export_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Remove_InputGestureText}">
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Remove_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=step_ContextMenu_Add_Load_Header}"
ItemsSource="{StaticResource mnuLoadSubmenuCommon}"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate"
ItemsSource="{Binding Steps}"
ItemTemplate="{StaticResource StepTemplate}">
<TextBlock Text="{Binding Name}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Edit_InputGestureText}"
Click="EditProject_Click">
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Edit_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem>
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Save_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Copy_Header}"
InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Copy_InputGestureText}" />
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Paste_Header}"
InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Paste_InputGestureText}" />
<MenuItem InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Remove_InputGestureText}">
<MenuItem.Header>
<TextBlock Text="{Binding Path=Name,
StringFormat={Resx ResxName=PSSPECApplication.Controls.ProjectControlResources,Key=project_ContextMenu_Remove_Header}}" />
</MenuItem.Header>
</MenuItem>
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Project_AddStep_Header}" />
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Project_ImportStep_Header}" />
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeViewItem
Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Header}"
ItemsSource="{Binding}"
IsExpanded="True"
ItemTemplate="{StaticResource ProjectTemplate}">
<TreeViewItem.ContextMenu>
<ContextMenu>
<MenuItem Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Paste_Header}"
InputGestureText="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Paste_InputGestureText}" />
</ContextMenu>
</TreeViewItem.ContextMenu>
</TreeViewItem>
</TreeView>
And here is my click event
private void EditProject_Click(object sender, RoutedEventArgs e)
{
//how do I find the bound item of the node this context menu resides on?
}
I am trying to write the EditProject_Click event for the ContextMenu MenuItem click event. When I click it, I want to be able to find the item Bound to the node that the context menu resides. How do I do that?
The answer
private void EditProject_Click(object sender, RoutedEventArgs e)
{
Project project = (Project)((MenuItem)sender).DataContext;
//Do stuff with the project here
}
Also, if you want to get your ContextMenu to update it's DataContext from the element the ContextMenu is suppose to be attached to, here is the syntax for that:
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
In the click event handler, would "(sender as FrameworkElement).DataContext" be what you're looking for?
EDIT:
Sample code below.
XAML:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:v="clr-namespace:WpfApplication3"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="template">
<TextBlock Text="{Binding}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Test" Click="MenuItem_Click"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
</Window.Resources>
<DockPanel>
<Button DockPanel.Dock="Top" Click="Button_Click">Change Context</Button>
<TreeView x:Name="tv" ItemTemplate="{StaticResource template}"/>
</DockPanel>
</Window>
Code-behind:
public partial class MainWindow : Window
{
bool flag = false;
public MainWindow()
{
InitializeComponent();
List list = new List() { "A", "B", "C", "D" };
this.tv.ItemsSource = list;
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show((sender as MenuItem).DataContext.ToString());
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (flag)
{
List list = new List() { "A", "B", "C", "D" };
this.tv.ItemsSource = list;
}
else
{
List list = new List() { 1, 2, 3, 4 };
this.tv.ItemsSource = list;
}
flag = !flag;
}
}
这篇关于查找树型视图从文本菜单绑定项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!