1

エンティティビューモデルがあります。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はリソースファイルに保存されます。任意のガイダンスをいただければ幸いです。ありがとうございました。

よろしく、

4

1 に答える 1

1

データ テンプレートの境界線で MouseRightButtonUp イベントを処理し、次のようなコンテキスト メニュー ランタイムを作成します。

private void borderMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    OpenContextMenu(sender as ComboBox);
}


private void OpenContextMenu(FrameworkElement element)
{
    if (element.ContextMenu == null)
    {
        ContextMenu c = new ContextMenu();
        //Load the ContextOperations from ViewModel 
        //based on the Framework element datacontext
        ContextOperations.ToList().ForEach(co => c.Items.Add(new MenuItem()
        { 
           //Create your menu item
        }));

        element.ContextMenu = c;

    }

    element.ContextMenu.PlacementTarget = element;
    element.ContextMenu.IsOpen = true;

}

XAML から contextmenu の定義を削除します。

于 2012-10-03T13:21:42.780 に答える