查找树型视图从文本菜单绑定项目 [英] Find Bound Item from TreeViewItem from ContextMenu

查看:157
本文介绍了查找树型视图从文本菜单绑定项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的树视图,看起来像这样:

 < TreeView控件
                Grid.Column =0
                Grid.Row =2
                了minHeight =100
                了minWidth =100
                BorderBrush =白
                的DataContext ={结合项目,源= {X:静态SizingApp:M​​anager.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 =htt​​p://schemas.microsoft.com/winfx/2006/xaml/$p$psentation
        的xmlns:X =htt​​p://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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆