【问题标题】:usercontrol (?) for WPF reusable menu用于 WPF 可重用菜单的用户控件 (?)
【发布时间】:2014-05-13 13:47:02
【问题描述】:

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

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

为此,我需要每个属性的菜单,用户可以从中选择他们想要过滤项目的过滤条件。相同类型的每个属性都将具有相同的菜单项集,并具有各种过滤条件。 (对于字符串:以...开头,以...结尾对于整数:低于、高于等) 菜单也需要一些代码,所以我不想分别为每个属性编写这些代码。

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

【问题讨论】:

  • 每个属性的菜单是什么意思?
  • 也许您需要动态地(又名在代码中)创建上下文菜单?这可以是某个类的单个方法(甚至是直接在事件处理程序中,你没有提到 MVVM)。
  • Blam:项目所属的类具有一些属性,例如:StringProperty1、StringProperty2、IntProperty1 等。我有一个用于 StringProperty1 的菜单(带有 StartsWith、EndsWith 等子菜单),一个用于 StringProperty2 的菜单(完全像前一个),IntProperty1 的一个菜单(带有 LowerThan 等子菜单)......我不想为同一类型的各种属性单独编程菜单。
  • Sinatr:这正是我不想做的 :) 我需要 xaml,因为菜单一点也不简单。
  • 那么Sheridan 的回答是否正确? “每个属性的菜单”“类型将具有相同的菜单项集”我仍然不清楚

标签: c# wpf xaml user-controls listbox


【解决方案1】:

在 WPF 中,我们使用的数据元素的公共属性是通过DataTemplates 绑定到各种 UI 控件属性的数据。请参阅 MSDN 上的Data Templating Overview 页面以获取完整的故事。

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

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

所以要直接回答您的问题,Menu 控件将最适合您使用,但您不会将 Menu 属性存储在您的代码中...您将属性值存储在您的自定义将数据绑定到Menu 控件属性的类:

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

值得指出的是,您可能需要像往常一样在Style 中设置子MenuItem 属性,而不是DataTemplate(取自WPF MenuItem : Mix databound items and static content 问题的已接受答案(我建议您在 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>

你会在网上找到更多关于数据绑定到MenuItems 的教程和相关问题,所以我在这里不再赘述。请参阅以下文章开始:

Binding menus using HeirarchicalDataTemplates

【讨论】:

  • 我(在基本层面上)了解 DataTemplates 和数据绑定,但我不确定我是否了解建议的解决方案。 :) 如果我理解正确,我的问题是关于如何在“CollectionOfYourCustomClassItems”中开发“YourCustomClass”类型。如果那个“YourCustomClass”是一个为特定类型定义过滤器菜单的类。重要的是,如果没有 XAML,我无法真正开发这些菜单,因为它们的内部结构有点困难。
  • 您需要添加到自定义类中的属性取决于您需要 MenuItems 提供的功能。例如,如果您希望MenuItems 在您单击它们时执行某些操作,那么您需要将ICommand 属性添加到您的类中......逻辑表明用户希望看到一些描述,所以然后你需要一个string 属性来标记你的MenuItems。就这么简单……您只需添加您需要的任何属性即可。或许您应该开始使用 WPF 和一个更简单的项目,直到您了解它是如何工作的?
  • 我能做到吗,但这是我现在拥有的项目,我必须应对它。我想我理解你的建议,有问题的部分仍然是我需要设计师来编辑我的菜单,因为它们不是那么简单,但是需要在 XAML 中手动创建数据模板。对不对?
  • 这不一定正确...DataTemplates 也可以使用包含 Blend 的更高版本的 Visual Studio 生成。还有提供类似功能的第三方实用程序。
  • 感谢您提供此信息。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2020-01-07
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多