我有TreeView,其中包含不同的項目類型。項目樣式通過自定義的ItemContainerStyleSelector屬性定義。WPF中的上下文菜單繼承
我的樣式都是共享基礎樣式,並且每種樣式中只定義了特定項目的樣式。它看起來像這樣:
<Style x:Key="BaseStyle" TargetType="{x:Type TreeViewItem}">
...
</Style>
<Style x:Key ="SomeSpecificStyle" TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource BaseStyle}">
<Setter Property="ContextMenu" Value="{StaticResource NodeContextMenu}"/>
...
</Style>
<Style x:Key ="SomeSpecificStyle" TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource BaseStyle}">
<Setter Property="ContextMenu" Value="{StaticResource AnotherNodeContextMenu}"/>
...
</Style>
上下文菜單中這樣定義
<ContextMenu x:Key="NodeContextMenu">
<MenuItem Header="Select Views" Command="{Binding Path=OpenViewsCommand}" />
...other specific entries
<MenuItem Header="Remove" Command="{Binding Path=DocumentRemoveCommand}" />
...other entries common for all menus
</ContextMenu>
另一個上下文菜單中還應該包含像刪除這些常見的物品。每當命令屬性等發生更改時,都需要通過複製粘貼複製這些內容。地獄的可維護性。有沒有辦法定義一個包含常用項目的上下文菜單,然後「派生」特定的上下文菜單?
編輯:我發現從這個線程提示的解決方案: 我定義了一個集合與普通的物品,並定義菜單時使用複合集合包括新項目和公共項目集合
<CompositeCollection x:Key="CommonItems">
<MenuItem Header="Remove" Command="{Binding Path=DocumentRemoveCommand}">
....Other common stuff
</CompositeCollection>
<ContextMenu x:Key="NodeContextMenu">
<ContextMenu.ItemsSource>
<CompositeCollection>
<MenuItem Header="Select Views" Command="{Binding Path=OpenViewsCommand}" />
<CollectionContainer Collection="{StaticResource CommonItems}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
最好是你發佈你自己的答案與編輯你的問題的答案。 – LarsTech