TreeViewがあり、基本的なTreeItemタイプを作成しました。各TreeItemには、ヘッダー、子用のTreeItemコレクション、および可能なコンテキストメニュー用のコレクションがあります。TreeItemクラスには次のオブジェクトがあります。
public delegate void dExecute(TreeItem item);
public dExecute ExecuteTarget { get; set; }
public object Tag { get; set; }
public string Header { get; set; }
public List<TreeItem> Children { get; set; }
public List<TreeItem> ContextMenu { get; set; }
コンテキストメニューは再びHierarchicalDataTemplateを使用してTreeItemオブジェクトを表示します(ツリービューとコンテキストメニューの項目にはTreeItemクラスを使用します)。コンテキストメニューは次のようになります。
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" Visibility="{Binding ShowContextMenu}" ItemsSource="{Binding ContextMenu}">
<ContextMenu.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Header}" />
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding Execute}"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
コンテキストメニューは、希望どおりにレンダリングされます。ツリービューのいくつかのアイテムにアタッチするだけのコンテキストメニューを作成しました。これがその内容です。
public List<TreeItem> ContextMenu
{
get
{
List<TreeItem> list = new List<TreeItem>();
TreeItem ti = new TreeItem("Some Action") { ExecuteTarget = targetMethod};
list.Add(ti);
ti = new TreeItem("test");
ti.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
ti.Children.Add(new TreeItem("bar") { ExecuteTarget = targetMethod});
ti.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
TreeItem ti2 = new TreeItem("inner"){ ExecuteTarget = targetMethod};
ti.Children.Add(ti2);
ti2.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
list.Add(ti);
return list;
}
}
コンテキストメニューは次のようになります。
あるべき姿に見えます。コマンドは正常に機能します。コンテキストメニューの最上位にあるコマンドを除きます。「SomeAction」をクリックしても何も起こりません。XAMLに何かを追加する必要があると思いますが、どこにあるのかわかりません。