2017-10-11 143 views
-1

我想在WPF DataGrid中創建一個動態的上下文菜單。以下是我需要幫助的問題:C#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.

基本上,上下文菜單被結合PackageCM.Members與具有類別對象的列表,我想顯示在上下文菜單根類別名稱。接下來,每個類別都包含一個項目列表,這些項目將顯示爲子菜單。

在此先感謝您的幫助。

回答

1

首先,您的ContextMenu.ItemTemplate定義不正確,當您爲ContextMenu設置ItemSource時,您並未自己定義MenuItem,因爲實際上ContextMenu會將此內容包裝到另一個MenuItem中。所以,你需要你的模板改變這樣的事情:

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

你需要把一個TextBlock而不是MenuItem因爲你想在你ContextMenu菜單來顯示文本,並在模型的Text屬性綁定到一個歡迎使用屬性。但是爲了這樣工作,用於子菜單的根菜單和模型的模型必須具有一個名稱相同的屬性,對於子菜單,您的情況爲DisplayName,因此在根菜單模型中也必須具有一個名爲DisplayName,此屬性綁定到TextBlock的Text屬性。

您需要在模型中進行一些重命名,或者在Category模型中引入一個名爲DisplayName的新名稱。所以你的模型會有一個共同的問題,像這樣的代碼片段:

// 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是如何與子菜單一起工作的。 –