2013-09-03 32 views
5

Nếu trình đơn Ngữ cảnh được "mã hóa cứng" trong xaml, thì rất dễ dàng để thêm menu con. Ví dụ:Trình đơn phụ WPF cho trình đơn ngữ cảnh

<ContextMenu> 
    <MenuItem Header="Comm1" Command="{Binding Blabla1}"> 
     <MenuItem Header="SubComm1" Command="{Binding Blabla2}"></MenuItem> 
    </MenuItem> 
    <MenuItem Command="Comm2"></MenuItem> 
    <MenuItem Command="Comm3"></MenuItem> 
</ContextMenu> 

Điều này có nghĩa là ContextMenu có ba phần tử (Comm1, Comm2 và Comm3) và Comm1 có menu con SubComm1.

Tôi đã thực hiện ContextMenu của tôi một chút linh hoạt hơn:

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter> 
      <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 

Về cơ bản tôi có thể có bất kỳ số lượng các yếu tố trong ContextMenu, và bất kỳ yếu tố có thể có bất kỳ lệnh. Làm thế nào tôi có thể thêm menu con vào phần tử ContextMenu?

+0

Liên kết cấu trúc dữ liệu cây của bạn với ItemsSource và sử dụng Trình chuyển đổi chuyển đổi dữ liệu thành MenuItems. –

Trả lời

10

Bạn có thể đặt MenuItem.ItemsSource cho bộ sưu tập lồng nhau. Điều này sẽ tạo ra menu phụ cho bất kỳ menuitem nào. Đối với điều này mô hình sao lưu MenuItem của bạn nên có bộ sưu tập submenuitems trong đó

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="ItemsSource" Value="{Binding ContextMenuSubItems}"></Setter> 
      <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter> 
      <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 

Tương tự như vậy bạn có thể đặt MenuItem.ItemContainerStyleMenuItem.ItemTemplate để tạo kiểu submenuitems của bạn.