如何将静态项添加到绑定到现有数据源的上下文菜单中
本文关键字:数据源 上下文 菜单 绑定 静态 添加 | 更新日期: 2023-09-27 18:36:52
我有一个上下文菜单,它使用 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>
它目前将显示如下: 菜单项
基本上,我想添加两个静态项:另一个永远不会更改的 MenuItem 和一个分隔我的静态内容和动态内容的间隔器。我可以把我的收藏与这些数据绑定在一起,但我觉得应该有一个更优雅的解决方案。我也宁愿避免使用子上下文菜单。
编辑:这是我最终实现的内容:
<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>
然后,我的 SubmitItemStyleSelector 从 MyDataSource 中找到我想要的类型,以便对这些项目进行额外的样式设置。
你应该使用 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>