用于WPF可重用菜单的usercontrol (?)

本文关键字:usercontrol 菜单 WPF 用于 | 更新日期: 2023-09-27 18:03:11

我是WPF的初学者,所以如果这个问题太简单,请原谅我:)

我有一个列表框,我想通过各种过滤条件进行过滤。我用特定类型的实例填充这个列表框。每个筛选条件都与列表框项的一个属性相关联。(它们就像:这个或那个字符串属性以字符串XXX开头。)

为此,我需要为每个属性提供一个菜单,用户可以从中选择他们想要过滤项目的过滤条件。相同类型的每个属性将具有具有不同筛选条件的相同菜单项集。(对于字符串:以…开始,以…结束)对于int类型:低于,高于,等等)菜单也需要一些代码,所以我不想为每个属性分别编程。

我的问题是,我不知道在什么方式可以编程这些。我不能将它们编程为用户控件,因为我所需要的只是菜单中的菜单项。但是我不能将它们编程为MenuItem的派生类,因为我需要为每种类型设计它们的XAML。我可以用XAML创建一个菜单项派生类吗?或者你有其他的建议吗?

用于WPF可重用菜单的usercontrol (?)

在WPF中,我们使用的数据元素的公共属性是通过DataTemplate绑定到各种UI控件的属性。请参阅MSDN上的数据模板概述页面了解完整的故事。

为了做到这一点,我们开发自定义类,其中包含我们需要显示的所有必要属性,然后我们声明一个或多个DataTemplate定义类和UI控件之间的绑定连接,或者在您的情况下MenuItem

这样做的好处是,为了在UI中显示Menu,您只需要将一个自定义菜单类对象绑定到UI中的控件,并让DataTemplate完成其余的工作。因此,如果您想更改菜单内容,您只需要更改数据项,即数据绑定到Menu

所以直接回答你的问题,Menu控件将是最适合你使用的,但你不存储Menu属性在你的代码后面…您将属性值存储在您的自定义类中,这些类将被数据绑定到Menu控件属性:

<Menu ItemsSource="{Binding CollectionOfYourCustomClassItems}" ... />

值得指出的是,您可能需要在Style中设置子MenuItem属性,而不是像往常一样在DataTemplate中设置(从对WPF菜单项的公认答案中获取:混合数据绑定项和静态内容问题(我建议您在Stack Overflow上阅读):

<MenuItem Header="_Recent Files" ItemsSource="{Binding Commands,Mode=OneWay}">
  <MenuItem.ItemContainerStyle>
    <Style TargetType="{x:Type MenuItem}">
       <Setter Property="Header" Value="{Binding Path=ShortName}" />
       <Setter Property="ToolTip" Value="{Binding Path=FileName}" />
       <Setter Property="Command" Value="{Binding Path=OpenCommand}" />
       <Setter Property="CommandParameter" Value="{Binding Path=OpenParameter}" />
       <Style.Triggers>
         <DataTrigger Binding="{Binding Path=IsSeparator}" Value="true">
           <Setter Property="MenuItem.Template">
             <Setter.Value>
               <ControlTemplate TargetType="{x:Type MenuItem}">
                 <Separator Style="{DynamicResource {x:Static MenuItem.SeparatorStyleKey}}"/>
               </ControlTemplate>
             </Setter.Value>
           </Setter>
         </DataTrigger>
       </Style.Triggers>
     </Style>
   </MenuItem.ItemContainerStyle>
 </MenuItem>

您可以在网上找到更多关于数据绑定到MenuItem s的教程和相关问题,所以我不会在这里重复所有内容。请从以下文章开始:

使用HeirarchicalDataTemplates绑定菜单