2010-08-24 51 views
4

查找树型视图绑定项目我有这样的树视图,看起来像这样:从文本菜单

 <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> 

这里是我的单击事件

private void EditProject_Click(object sender, RoutedEventArgs e) 
    { 
     //how do I find the bound item of the node this context menu resides on? 
    } 

我试图写的的EditProject_Click事件ContextMenu MenuItem点击事件。当我点击它时,我希望能够找到绑定到上下文菜单所在节点的项目。我怎么做?


答案

private void EditProject_Click(object sender, RoutedEventArgs e) 
    { 
     Project project = (Project)((MenuItem)sender).DataContext; 

     //Do stuff with the project here 
    } 

另外,如果你想获得你的文本菜单来更新它的DataContext从文本菜单是假设被附加到元素,这里是该语法:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
+1

我已经添加了答案。 – Ristogod 2010-08-24 21:23:43

+0

这个答案需要更多upvote,我搜索这个解决方案数周! – HypeZ 2014-06-13 10:48:11

回答

6

在click事件处理程序中,“(sender as FrameworkElement).DataContext”是你要找的东西吗?

编辑:

示例下面的代码。

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> 

代码隐藏:


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; 
    } 

}
+0

其实没有。我可以第一次从MenuItem获取DataContext。但是,如果我更改树中的项目并更新树,无论出于何种原因,上下文菜单项拒绝更新其DataContext,因此ContextMenu中的所有内容仍然绑定到错误的对象。 我无法弄清楚如何让我的ContextMenu的DataContext保持与它们的父元素相同。 – Ristogod 2010-08-25 16:11:35

+0

你可能在这里有一个不同的问题。 (也许与财产更改通知或某事有关)。无论如何,看我的编辑。我写了一个小测试应用程序,显示我的答案有效,即使TreeView的ItemsSource发生了变化。 – ASanch 2010-08-25 18:33:53

+0

我确定我的问题与上下文菜单失去它的绑定到其父元素。请参阅上面的内容以查看我如何解决问题的答案。 – Ristogod 2010-09-03 20:24:20