加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MenuItem模板根据绑定数据进行更改

发布时间:2020-12-15 22:46:05 所属栏目:百科 来源:网络整理
导读:基本上我有一个View,它绑定到一个具有MenuItems的ViewModel. 我想要做的是,每当菜单标题为“ – ”时,我想放置一个分隔符. 从理论上讲,我似乎可以避免使用TemplateSelectors,但如果您认为这是不可避免的,请分享这些解决方案. 这是XAML: Window x:Class="Wpf
基本上我有一个View,它绑定到一个具有MenuItems的ViewModel.

我想要做的是,每当菜单标题为“ – ”时,我想放置一个分隔符.

从理论上讲,我似乎可以避免使用TemplateSelectors,但如果您认为这是不可避免的,请分享这些解决方案.

这是XAML:

<Window x:Class="WpfApp1.MenuItemStyle"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MenuItemStyle" Height="300" Width="300">
    <DockPanel>
        <Menu DockPanel.Dock="Top" ItemsSource="{Binding MenuItems}">
            <Menu.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <HierarchicalDataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Title}" Value="-">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                                        <Separator />
                                    </HierarchicalDataTemplate>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </HierarchicalDataTemplate.Triggers>

                    <TextBlock Text="{Binding Title}" Background="Red" />
                </HierarchicalDataTemplate>
            </Menu.ItemTemplate>

        </Menu>
        <Grid>
        </Grid>
    </DockPanel>
</Window>

以下是代码背后的代码:

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MenuItemStyle.xaml
    /// </summary>
    public partial class MenuItemStyle : Window
    {
        public MenuItemStyle()
        {
            InitializeComponent();

            this.DataContext = this;
        }

        public ObservableCollection<MenuItem> MenuItems { get; set; } = new ObservableCollection<MenuItem> {
            new MenuItem{ Title = "M1",Children= new ObservableCollection<MenuItem>{
                    new MenuItem{ Title = "M2"},new MenuItem{ Title = "-"},new MenuItem{ Title = "M3"},}
            }
        };
    }

    public class MenuItem
    {
        public string Title { get; set; }   
        public ObservableCollection<MenuItem> Children { get; set; }
    }
}

我到处寻找解决方案,但找不到务实的解决方案.

解决方法

您可以为MenuItem创建样式.使其成为具体菜单实例的本地(通过放置在菜单的Resources中)或将其放在资源字典中:

<Menu ItemsSource="{Binding MenuItems}">
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Title}" Value="-">
                    <Setter Property="Template">
                         <Setter.Value>
                            <ControlTemplate>
                                <Separator/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Menu.Resources>
    <Menu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Title}" Background="Red" />
        </HierarchicalDataTemplate>
    </Menu.ItemTemplate>
</Menu>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读