用于WPF可重用菜单的usercontrol (?)
本文关键字:usercontrol 菜单 WPF 用于 | 更新日期: 2023-09-27 18:03:11
我是WPF的初学者,所以如果这个问题太简单,请原谅我:)
我有一个列表框,我想通过各种过滤条件进行过滤。我用特定类型的实例填充这个列表框。每个筛选条件都与列表框项的一个属性相关联。(它们就像:这个或那个字符串属性以字符串XXX开头。)
为此,我需要为每个属性提供一个菜单,用户可以从中选择他们想要过滤项目的过滤条件。相同类型的每个属性将具有具有不同筛选条件的相同菜单项集。(对于字符串:以…开始,以…结束)对于int类型:低于,高于,等等)菜单也需要一些代码,所以我不想为每个属性分别编程。
我的问题是,我不知道在什么方式可以编程这些。我不能将它们编程为用户控件,因为我所需要的只是菜单中的菜单项。但是我不能将它们编程为MenuItem的派生类,因为我需要为每种类型设计它们的XAML。我可以用XAML创建一个菜单项派生类吗?或者你有其他的建议吗?
在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绑定菜单