使用MVVM Light

时间:2015-12-08 20:29:40

标签: c# .net wpf mvvm

我在WPF中有一个上下文菜单,其中包含以下约束:

  • 菜单项应绑定到模型列表
  • 菜单可能包含分隔符
  • 菜单项可以包含子菜单项
  • 可以根据状态
  • 关闭菜单项
  • 菜单项的顺序可能不会改变(即菜单项1必须出现在菜单项2的上方,如果存在)

我见过视图模型包含控件列表的解决方案,但是,这不是一个可接受的解决方案。

我采取的方法几乎可行。

<ContextMenu DataContext="{Binding Data.ContextMenuViewModel, Source={StaticResource proxy}}"
         ItemsSource="{Binding Data.ContextMenuViewModel.MenuItems, Source={StaticResource proxy}}"
         Visibility="{Binding CellContextMenuOpen, Converter={StaticResource BoolToVisibilityConverter}}" >
<ContextMenu.ItemContainerStyle>
    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="Command" Value="{Binding Command}" />
        <Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
        <Setter Property="ItemsSource" Value="{Binding SubMenuItems}" />
        <Setter Property="IsCheckable" Value="{Binding IsCheckable, FallbackValue=False}" />
        <Setter Property="IsChecked" Value="{Binding IsChecked, FallbackValue=False}" />
    </Style>
</ContextMenu.ItemContainerStyle>
<ContextMenu.ItemTemplateSelector>
    <ccm:MenuItemTemplateSelector>
        <ccm:MenuItemTemplateSelector.SeparatorTemplate>
            <DataTemplate>
                <Separator HorizontalAlignment="Stretch" IsEnabled="False" Margin="0" />
            </DataTemplate>
        </ccm:MenuItemTemplateSelector.SeparatorTemplate>
        <ccm:MenuItemTemplateSelector.MenuItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Header}" />
            </DataTemplate>
        </ccm:MenuItemTemplateSelector.MenuItemTemplate>
    </ccm:MenuItemTemplateSelector>
</ContextMenu.ItemTemplateSelector>

但是,我发现ItemsContainerStyle和DataTemplate中的某些属性是互斥的。例如,如果我要向项容器样式添加可见性绑定,则根本不会应用数据模板。

上面的解决方案的问题是MenuItem本身不会基于绑定崩溃,我只能让标题崩溃。如果我不需要分隔符,我可以将所有内容放在ItemContainerStyle中并完成它。

任何建议都将不胜感激。

0 个答案:

没有答案