2011-11-22 131 views
2

我有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> 
+4

最好是你發佈你自己的答案與編輯你的問題的答案。 – LarsTech

回答

3

可以申報的項目爲資源和引用它們:

<Some.Resources> 
    <MenuItem x:Key="mi_SelectViews" x:Shared="false" 
       Header="Select Views" Command="{Binding Path=OpenViewsCommand}" /> 
    <MenuItem x:Key="mi_Remove" x:Shared="false" 
       Header="Remove" Command="{Binding Path=DocumentRemoveCommand}" /> 
</Some.Resources> 
<ContextMenu x:Key="NodeContextMenu"> 
    <StaticResource ResourceKey="mi_SelectViews" /> 
    ...other specific entries 
    <StaticResource ResourceKey="mi_Remove" /> 
    ...other entries common for all menus 
</ContextMenu> 

(該x:Shared很重要)


另一種可能性是經由對象模型的方法來生成MenuItems,你只綁定ItemsSource物體的一些清單,其模型的MenuItem(即,功能性子項目的屬性,標題和命令),那麼您可以創建一個可以成爲多個列表的一部分的模型Remove

+0

那麼,這是更好的原始解決方案,但仍然可以導致麻煩,因爲複製是必要的,如果新項目被添加或條目被刪除.. –

+0

@PetrOsipov:這是怎麼回事?你只有多個參考,你將永遠有至少。 –

+0

嗯,我會喜歡這樣的東西:BaseMenu包含一打通常的項目,只寫過一次。每個子菜單引用一個基本菜單,接管它的項目,並添加只有節點特定的東西。 –