2017-07-11 18 views
0

ViewModelのデータから階層的コンテキストメニューを動的に作成したいと思います。ビューモードで階層的コンテキストメニューを動的に作成するMVVM

、私はContextMenuAction定義:ビューで

public class ContextMenuAction : ViewModelBase 
{ 
    public string Header { get; set; } 
    public ICommand Action { get; set; } 
    public Brush Icon { get; set; } 
    public ObservableCollection<ContextMenuAction> SubActions { get; set; } = new ObservableCollection<ContextMenuAction>(); 
} 

<ContextMenu ItemsSource="{Binding Path=PlacementTarget.Tag.Actions, RelativeSource={RelativeSource Self}}"> 
<ContextMenu.ItemTemplate > 
    <DataTemplate DataType="MenuItem"> 
     <MenuItem/> 
    </DataTemplate> 
</ContextMenu.ItemTemplate> 

<ContextMenu.ItemContainerStyle> 
    <Style TargetType="MenuItem"> 
     <Setter Property="ItemsSource" Value="{Binding SubActions}"/> 
     <Setter Property="Header" Value="{Binding Header}" /> 
     <Setter Property="Command" Value="{Binding Action}"/> 
    </Style> 
</ContextMenu.ItemContainerStyle> 

これが結果、コンテキストメニューでテキストなしです。

enter image description here

私はすでに結合をチェックするために、出力ウィンドウをチェック

は、すべてのバインディングが動作し、例外はありません。

私はその理由を見つけるのを助けてください、事前に感謝!

+0

実行時にのMenuItemのDataContextのを確認するために、「スヌープ」プログラムを使用して、データがあなたはそれがあることを期待するものであるかどうかを確認することができます。 "wpf snoop"についてgoogleを検索してください。最近オープンソースプログラムです。 – Mishka

答えて

1

あなたはHierarchicalDataTemplateを定義する必要があります。

<ContextMenu ItemsSource="{Binding Path=PlacementTarget.Tag.Actions, RelativeSource={RelativeSource Self}}"> 
    <ContextMenu.ItemTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type local:ContextMenuAction}" ItemsSource="{Binding SubActions}"> 
      <TextBlock Text="{Binding Header}" /> 
     </HierarchicalDataTemplate> 
    </ContextMenu.ItemTemplate> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Command" Value="{Binding Action}"/> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 
+0

それは働いた!私はセパレータを追加したい場合に備えてもう一つの質問があります。私に提案をお願いしますか? – quangdien

+0

セパレータをどこに追加しますか?別の問題がある場合は、新しい質問をしてください。 – mm8

関連する問題