2014-05-09 51 views
1

我有一個「簡單」的任務,在MVVM方式下完成TreeView(Element)上的ContextMenu。 在網上搜索時,我發現了一些解決方案,可以使用按鈕等工作,但不能與TreeView一起使用。我認爲問題在於設置TreeView的ItemsSource屬性,它爲每個項目提供一個自己的DataContext。MVVM風格的TreeView-Element上的ContextMenu

這裏是我的小測試,應用,在那裏你可以看到按鈕的工作原理,但不是爲TreeView控件元素:

MainWindow.xaml:

<Window x:Class="ContextMenu.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid > 
     <StackPanel> 
      <TextBlock Text="{Binding MyText}" /> 

      <Button Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=Self}}" Content="Click me"> 
       <Button.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="{Binding PlacementTarget.Tag.MyText, 
          RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" /> 
        </ContextMenu> 
       </Button.ContextMenu> 
      </Button> 

      <TreeView ItemsSource="{Binding MyList}" Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=Self}}"> 
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate> 
         <TextBlock Text="{Binding Name}"> 
          <TextBlock.ContextMenu> 
           <ContextMenu> 
            <MenuItem Header="{Binding Path=PlacementTarget.Tag.MyText, 
             RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" /> 
           </ContextMenu> 
          </TextBlock.ContextMenu> 
         </TextBlock> 
        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate>   
      </TreeView> 

     </StackPanel>   
    </Grid> 
</Window> 

代碼隱藏:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MainWindowVM(); 
    } 
} 

MainWindowVM.cs:

public class MainWindowVM 
{ 
    public string MyText { get; set; } 
    public ObservableCollection<TreeElement> MyList { get; set; } 

    public MainWindowVM() 
    { 
     MyText = "This is my Text!"; 
     MyList = new ObservableCollection<TreeElement>(); 
     MyList.Add(new TreeElement("String 1")); 
     MyList.Add(new TreeElement("String 2")); 
    } 
} 

public class TreeElement 
{ 
    public string Name { get; set; } 
    public TreeElement(string Name) 
    { 
     this.Name = Name; 
    } 
} 

感謝您的幫助! Joerg

回答

1

You are close。

你在做什麼:

  1. 您設置的TreeViewTag自身的DataContext。這是不必要的 。
  2. 你試圖從你的ContextMenu.PlacementTarget得到Tag.MyText - 這是TextBlockTextBlock沒有Tag集。

你應該做的:

  1. 設置的TextBlockTag到Window 的DataContext(窗口是TextBlock祖先,你應該看看它通過 RelativeSource Mode=FindAncestor)。
  2. 第二部分確定 - 您在第一步中設置了TextBlock.Tag
+0

謝謝你的幫助。我沒有對「安裝目標和標籤」的「全面理解」......在你的回答清楚之後:) – joerg