エンティティビューモデルがあります。UIには多くのエンティティが存在する可能性があるため、エンティティビューモデルを表すためにDataTemplateを使用しました。このデータテンプレートは、コンテナコントロールのItemTemplateプロパティがエンティティをレンダリングするために使用します。これは従来のListView/ListBoxコントロールではないことに注意してください。これは、データテンプレートによって表されるエッジとノードを備えたグラフコントロールです。つまり、各ノードは異なるタイプであり、ユーザーが右クリックすると、テンプレートのコンテキストメニューがビューモデルによって提供されるコレクションにバインドされます。次のコードは正常に機能しています。
<DataTemplate DataType="{x:Type model:Person}">
<Border Style="{StaticResource NodeBorderStyle}" MinWidth="200">
<Border.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextOperations}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding PlacementTarget.DataContext.HandleContextOperationCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<Setter Property="CommandParameter" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Header}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Border.ContextMenu>
....................
</Border >
</DataTemplate>
これには制限がありContextOperations
、ビューモデルが初期化されるときに(ObservableCollection)プロパティを設定する必要があります。多数のノードが存在する可能性があるため、ロード時にすべてのノードのコンテキストメニュー項目を保存することは、膨大なメモリの問題になる可能性があります。ユーザーがエンティティ(テンプレート)を右クリックすると、ビューモデルのContextOperations
プロパティが入力され、コンテキストメニューが表示されるようにしたいと思います。このDataTemplateはリソースファイルに保存されます。任意のガイダンスをいただければ幸いです。ありがとうございました。
よろしく、