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

时间:2014-05-13 13:47:03

标签: c# wpf xaml user-controls listbox

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

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

为此,我需要为每个属性提供一个菜单,用户可以从中选择要过滤项目的过滤条件。相同类型的每个属性将具有与各种过滤条件完全相同的菜单项集。 (对于字符串:以...开头,以...结尾为ints:低于,高于等) 菜单也需要一些代码,所以我不想单独为每个属性编程。

我的问题是我不知道我可以用这种方式编程。我无法将它们编程为UserControls,因为我需要的只是菜单中的MenuItems。但我无法将它们编程为MenuItem派生类,因为我需要XAML来为每种类型设计它们。我可以用某种方式创建一个带有XAML的MenuItem派生类吗?或者您还有其他建议吗?

1 个答案:

答案 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在线的教程和相关问题,所以我不会在这里再次讨论所有内容。请参阅以下文章:

WPF MenuItem : Mix databound items and static content

相关问题