2017-10-11 19 views
-1

私はWPF DataGridで動的コンテキストメニューを作成しようとしています。WPFのコンテキストメニューのデータバインド

1)ルートメニューアイテムヘッダーはサブメニューが正常に動作している間はViewModelとバインドされません。

2)サブメニューは、常に右側の代わりに左側にポップアップ表示されます。これをスタイルでどうやって解決できますか?

<DataGrid.ContextMenu> 
<ContextMenu ItemsSource="{Binding PackageCM.Members}" HasDropShadow="True" Placement="Right"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding CategoryName}" /> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
    <ContextMenu.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
      <MenuItem Header="{Binding DisplayName}" Command="{Binding AllPackagesVM.OpenCOBAPackageCommand, Source={StaticResource Locator}}"></MenuItem> 
     </HierarchicalDataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

Root Menu Item Header are not being bind.

基本的には、コンテキストメニューには、Categoryオブジェクトのリストを持っていると私はコンテキストメニューのルートにカテゴリ名を表示したいとPackageCM.Membersに結合されます。その後、各カテゴリには、サブメニューとして表示されるアイテムのリストが含まれます。

ご協力いただきありがとうございます。

答えて

1

まず、ContextMenu.ItemTemplateの定義が間違っています。ContextMenuのItemSourceを設定すると、実際にContextMenuがこのコンテンツを別のMenuItem内にラップするため、MenuItemを自分で定義しません。ですから、このような何かにあなたのテンプレートを変更する必要があります。

<ContextMenu ItemsSource="{Binding PackageCM.Members}" ...> 
    <ContextMenu.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding DisplayName}"></TextBlock > 
     </HierarchicalDataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

あなたはTextBlock代わりのMenuItemを配置する必要があり、あなたのContextMenuメニューにテキストを表示し、モデルにpropetyにそのTextプロパティをバインドしたいので、 。しかし、これが機能するには、サブメニューに使用されるルートメニューとモデルに使用されるモデルには同じ名前のプロパティが必要です。サブメニューの場合はDisplayNameです。したがって、ルートメニューモデルでは、 DisplayName、このプロパティはTextBlockのTextプロパティにバインドされています。

モデルでいくつかの名前を変更するか、モデルにDisplayNameという名前の新しい特性を導入する必要があります。だからあなたのモデルは、共通のpropetyを持つことになり、このスニペットのようなもの:

// for root menu 
public class Category 
{ 
    public string CategoryName { get; } 
    public string DisplayName => CategoryName; 
    ... 
} 

// for submenus 
public class Item 
{ 
    public string DisplayName { get; } 
    ... 
} 

うまくいけば、この説明は、あなたがヘッダの値を欠落しているため、問題を理解するのに役立ちます。

+0

ありがとう、Redouane。それは素晴らしい仕事をしており、ContextMenuが正しく表示されているのがわかりました。さらに、今私はContextMenuがどのようにサブメニューで動作しているのか理解しています。 –

関連する問題