2017-04-03 53 views
0

正如您在下圖中看到的,您可以看到2個懸停狀態。這裏是XAMLMenuCollection綁定兩次MVVM +數據綁定子菜單項

<Menu ItemsSource="{Binding Data.MenuCollection}"> 
    <Menu.ItemTemplate > 
     <DataTemplate DataType="MenuItem"> 
      <MenuItem Header="{Binding Header}" Command="{Binding Command}" ItemsSource="{Binding Children}"/> 
     </DataTemplate> 
    </Menu.ItemTemplate> 
</Menu> 

數據的收集工作在標題上。但是我無法顯示子節點。

public void CreateTempMenuList() 
{ 
    MenuCollection = new ObservableCollection<MenuItem>() 
    { 
     new MenuItem() 
     { 
      Header = "File", 
      Children = new ObservableCollection<MenuItem>() 
      { 
       new MenuItem() 
       { 
        Header = "Exit" 
       } 
      } 
     } 
    }; 
} 

MenuItem這個類是我創建的東西。每個屬性都有一個叫做OnPropertiesChanged函數的setter。如果需要,我可以添加該類,但是我非常確定這不是問題。

所以我的問題是。我如何擺脫'double' hover。在圖片中你可以看到2 borders。我徘徊的outer border。懸停直到專注於別的東西。

我的第二個問題是我如何獲得子項目的工作? menuitem標籤上的itemssource可能是錯誤的,但它的全部我都能想到。

enter image description here

回答

1

定義一個HierarchicalDataTemplate

<Menu ItemsSource="{Binding Data.MenuCollection}"> 
    <Menu.Resources> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Command" Value="{Binding Command}" /> 
     </Style> 
    </Menu.Resources> 
    <Menu.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Header}" /> 
     </HierarchicalDataTemplate> 
    </Menu.ItemTemplate> 
</Menu> 

一個System.Windows.Controls.MenuItem容器,每個項目是隱式創建,所以你不應該在模板中添加另一個MenuItem元素。

還請確保您沒有綁定到ObservableCollection<System.Windows.Controls.MenuItem>,因爲ItemTemplate不會應用於內置的MenuItem元素。

+0

感謝您的快速回復。是的,我沒有綁定到系統MenuItem類,我已經建立了自己的類。謝謝:) –

0

要使您當前的代碼正常工作,請右鍵單擊您的Menu control > Edit Additional Template > Edit ItemContainerStyle > Edit Copy

而且在所生成的樣式,

搜索這一段代碼:

  <Trigger Property="Role" Value="TopLevelItem"> 
       <Setter Property="Padding" Value="7,2,8,3"/> 
       <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/> 
      </Trigger> 

並改變Padding0代替7,2,8,3

+0

這個imo似乎'hacky'。我看到了答案。 –

+0

@ A.Mills你也應該知道幕後發生了什麼。 – AnjumSKhan