我是WPF的初学者,所以如果这个问题太简单,请原谅我:)
我有一个列表框,我想根据各种过滤条件进行过滤。这个列表框我填写了特定类型的实例。每个过滤条件都与列表框项的属性之一相关联。 (它们就像:这个或那个字符串属性以字符串XXX开头。)
为此,我需要为每个属性提供一个菜单,用户可以从中选择要过滤项目的过滤条件。相同类型的每个属性将具有与各种过滤条件完全相同的菜单项集。 (对于字符串:以...开头,以...结尾为ints:低于,高于等) 菜单也需要一些代码,所以我不想单独为每个属性编程。
我的问题是我不知道我可以用这种方式编程。我无法将它们编程为UserControls,因为我需要的只是菜单中的MenuItems。但我无法将它们编程为MenuItem派生类,因为我需要XAML来为每种类型设计它们。我可以用某种方式创建一个带有XAML的MenuItem派生类吗?或者您还有其他建议吗?
答案 0 :(得分:1)
在WPF中,我们使用数据元素,其公共属性是通过DataTemplate
s绑定到各种UI控件属性的数据。有关完整故事,请参阅MSDN上的Data Templating Overview页面。
为了做到这一点,我们开发了包含我们需要显示的所有必要属性的自定义类,然后我们声明了一个或多个DataTemplate
来定义类和UI控件之间的绑定连接或者在你的情况下MenuItem
。
这样做的好处是,为了在UI中显示Menu
,您只需要将一个自定义菜单类对象的数据绑定到UI中的控件,然后让DataTemplate
做其余的事。因此,如果要更改菜单内容,只需更改绑定到Menu
的数据的数据项。
因此,要直接回答您的问题,Menu
控件最适合您使用,但您不能将Menu
属性存储在您的代码中......您存储自定义类中的属性值将是绑定到Menu
控件属性的数据:
<Menu ItemsSource="{Binding CollectionOfYourCustomClassItems}" ... />
值得指出的是,您可能需要像往常一样在MenuItem
而非Style
中设置子DataTemplate
属性(取自{{3问题(我建议你阅读)在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
在线的教程和相关问题,所以我不会在这里再次讨论所有内容。请参阅以下文章: