繁体   English   中英

MVVM功能区应用程序菜单实现(WPF 4.5功能区)

[英]MVVM Ribbon Application Menu Implementation (WPF 4.5 Ribbon)

我正在尝试使用MVVM模式在WPF 4.5中实现功能区控件的应用程序菜单。 因此,我创建了一个ApplicationMenuViewModel,其中包含一个可观察的AbstractApplicationMenuItemViewModel集合,该集合是用于统一类... SplitItem和... Item的抽象类。 SplitItem应该能够包含其他RibbonApplicationMenuSplitItems或仅包含简单的RibbonApplicationMenuItems到任意级别的层次结构。 因此,它本身包含一个ObservableCollection,其中可能包含... SplitItems或普通... Items。 由于其他架构原因,ApplicationMenu本身通过工厂类提供。 我现在遇到的问题是ApplicationMenu中什么都没有显示。 ViewModel已正确实例化,因此我认为问题主要是由于我对ApplicationMenuSplitItemViewModel和ApplicationMenuViewModel中可能包含的两个不同项目的抽象。 因此,问题是实现模板和/或样式以显示RibbonApplicationMenu的最灵活,可维护和最简单的方法是什么? 目前,已应用以下模板:

<!--Ribbon Application Menu Styling and Templating-->
<DataTemplate DataType="{x:Type rvmmnu:ApplicationMenuViewModel}">
    <RibbonApplicationMenu ItemsSource="{Binding Children}"/>
</DataTemplate>

<DataTemplate DataType="{x:Type rvmmnu:ApplicationMenuItemViewModel}">
    <RibbonApplicationMenuItem Header="{Binding DisplayName}" 
                               ImageSource="{Binding ImageSource}" 
                               Command="{Binding Command}"/>
</DataTemplate>

<DataTemplate DataType="{x:Type rvmmnu:ApplicationMenuSplitItemViewModel}">
    <RibbonApplicationSplitMenuItem ItemsSource="{Binding Children}"
                                    Header="{Binding DisplayName}"/>
</DataTemplate>

功能区本身是用以下XAML实例化的:

    <Ribbon DockPanel.Dock="Top" ItemContainerStyle="{StaticResource    ResourceKey=ribbonTabStyle}" 
            ItemsSource="{Binding Path=Ribbon.Tabs}" 
            ApplicationMenu="{Binding Path=Ribbon.ApplicationMenu}"/>

使用此配置,“应用程序菜单”目前不显示任何内容。 我想问题出在我提取菜单中包含的两个层次项之间的差异这一事实。 我正在考虑为RibbonApplicationMenu和RibbonApplicationMenuSplitItem使用自定义模板选择器。 我正在考虑的另一种方法是将不同的对象类型(... SplitItem和... Item)划分为两个不同的集合,并对ItemsSource属性使用多重绑定。 但是我对这些方法并不真正满意,因为我认为有一种更简单的方法可以实现我想要的。

我最终通过使用模板和样式选择器检查提供给功能区的对象的类型并返回通过XAML实例提供的模板来实现了整个过程。 现在的XAML如下:

    <!--Ribbon Application Menu Styling and Templating-->

<Style x:Key="appMnuItemStyle">
    <Setter Property="RibbonApplicationMenuItem.Header" Value="{Binding DisplayName}"/>
    <Setter Property="RibbonApplicationMenuItem.ImageSource" Value="{Binding ImageSource}"/>
    <Setter Property="RibbonApplicationMenuItem.Command" Value="{Binding Command}"/>
</Style>

<Style x:Key="appMnuSplitItemStyle">
    <Setter Property="RibbonApplicationSplitMenuItem.ItemsSource" Value="{Binding Children}"/>
    <Setter Property="RibbonApplicationSplitMenuItem.Header" Value="{Binding DisplayName}"/>
    <Setter Property="RibbonApplicationSplitMenuItem.ItemTemplateSelector" Value="{DynamicResource appMnuItemTemplateSelector}"/>
    <Setter Property="RibbonApplicationSplitMenuItem.ImageSource" Value="{Binding Image}"/>
</Style>

<HierarchicalDataTemplate x:Key="appMnuSplitItemTemplate" DataType="{x:Type rvmmnu:ApplicationMenuSplitItemViewModel}"
                          ItemsSource="{Binding Children}"
                          ItemContainerStyle="{StaticResource ResourceKey=appMnuSplitItemStyle}"/>


<DataTemplate x:Key="appMnuItemTemplate"/>


<rvmmnu:ApplicationMenuItemTemplateSelector x:Key="appMnuItemTemplateSelector" 
                                            PlainItemTemplate="{StaticResource ResourceKey=appMnuItemTemplate}" 
                                            SplitItemTemplate="{StaticResource ResourceKey=appMnuSplitItemTemplate}"/>

<rvmmnu:ApplicationMenuStyleSelector x:Key="appMnuItemStyleSelector"
                                     PlainItemStyle="{StaticResource ResourceKey=appMnuItemStyle}" 
                                     SplitItemStyle="{StaticResource ResourceKey=appMnuSplitItemStyle}"/>

功能区现在被实例化为:

        <Ribbon DockPanel.Dock="Top" ItemContainerStyle="{StaticResource ResourceKey=ribbonTabStyle}" 
            ItemsSource="{Binding Path=Tabs}" DataContext="{Binding Ribbon}">
        <Ribbon.ApplicationMenu>
            <RibbonApplicationMenu ItemsSource="{Binding ApplicationMenu.Children}"
                                   ItemTemplateSelector="{StaticResource ResourceKey=appMnuItemTemplateSelector}"
                                   ItemContainerStyleSelector="{StaticResource appMnuItemStyleSelector}"/>
        </Ribbon.ApplicationMenu>
    </Ribbon>

我不确定这是否是最佳解决方案。 但这对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM