【发布时间】:2017-09-18 13:47:33
【问题描述】:
我想实现上下文菜单行为,例如Visual Studio 具有用于工具栏、可检查项目列表和命令列表。 上下文菜单项应该来自视图模型中的一些 observablecollection。
因为这些来自不同的来源。我想过使用复合集合来实现这一点。一个集合的绑定应该是 Command,其他是 IsChecked/IsChecked。我也想使用分隔符。
我遇到的问题是关于绑定。我不能将数据模板用于完整的菜单项,因为它不包括 IsChecked 属性。因此,我为此使用了 ItemContainerStyle(请参阅https://stackoverflow.com/a/29130774/5381620)。 只要我只使用 1 个收集容器并有 1 个来源,一切都很好。 但是,插入来自其他来源(或分隔符)的项目会将“样式”绑定应用到所有菜单项,这不是预期的,如果是“分隔符”,则会导致异常。
<ContextMenu>
<ContextMenu.Resources>
<CollectionViewSource x:Key="ContextMenuColCollection" Source="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path= DataContext.HeaderContextMenu}"/>
</ContextMenu.Resources>
<ContextMenu.ItemTemplate>
<DataTemplate DataType="{x:Type vm:Collection1VM}" >
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
<ContextMenu.ItemsSource>
<CompositeCollection>
<MenuItem Header="Settings"/>
<Separator />
<CollectionContainer Collection="{Binding Source={StaticResource ContextMenuColCollection}}"/>
</CompositeCollection>
</ContextMenu.ItemsSource>
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="IsCheckable" Value="True"/>
<Setter Property="IsChecked" Value="{Binding IsSelected}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
【问题讨论】:
-
如果我的方法有点愚蠢或者有更好的方法来实现这种类型的上下文菜单,这也会对我有很大帮助。
标签: c# wpf mvvm data-binding contextmenu