I have a context menu that binds to a collection using ItemsSource:
<Button Content="Submit">
<Button.ContextMenu>
<ContextMenu Name="SubmitButtonContextMenu" ItemsSource="{Binding MyDataSource}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<!-- Setters -->
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Button.ContextMenu>
</Button>
And it currently would show up like this: Menu Item
Basically, I want to add two static items: another MenuItem that will never change, and a spacer to separate my static content and my dynamic content. I could just stuff my collection that it's being bound to with this data, but I feel like there should be a more elegant solution. I would also prefer to avoid using subcontext menus.
EDIT: Here's what I ended up implementing:
<Window ...>
<Window.Resources>
<s:SubmitItemStyleSelector x:Key="SubmitItemStyleSelector">
<s:SubmitItemStyleSelector.SubmitButtonStyle>
<Style TargetType="MenuItem">
<!--Setters-->
</Style>
</s:SubmitItemStyleSelector.SubmitButtonStyle>
</s:SubmitItemStyleSelector>
<CollectionViewSource x:Key="MyDataViewSource" Source="{Binding MyDataSource}"/>
</Window.Resources>
...
<Button Content="Submit">
<Button.ContextMenu>
<ContextMenu ItemContainerStyleSelector="{Binding Source={StaticResource SubmitItemStyleSelector}}">
<ContextMenu.ItemsSource>
<CompositeCollection>
<MenuItem Header="No Change"/>
<Separator/>
<CollectionContainer Collection="{Binding Source={StaticResource MyDataViewSource}}"/>
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Button.ContextMenu>
</Button>
And then my SubmitItemStyleSelector finds the types I want from MyDataSource to do additional styling on just those items.
You should use CompositeCollection (msdn) :
<Window ..
>
<Window.Resources>
<CollectionViewSource x:Key="MyDynamicDataSource" Source="{Binding Path=MyDataSource}" />
...
</Window.Resources>
...
<Button Content="Submit" >
<Button.ContextMenu>
<ContextMenu Name="SubmitButtonContextMenu">
<ContextMenu.ItemsSource>
<CompositeCollection>
<MenuItem Header="First static item" />
<MenuItem Header="Second static item" />
<Separator />
<CollectionContainer Collection="{Binding Source={StaticResource MyDynamicDataSource}}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Button.ContextMenu>
</Button>
...
</Window>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With