2010-08-24 52 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