【问题标题】:How do I create a "Window" menu in XAML?如何在 XAML 中创建“窗口”菜单?
【发布时间】:2014-02-10 06:40:00
【问题描述】:

我正在创建一个 MVVM Wpf 客户端应用程序。我想在主视图中为应用程序创建菜单,该应用程序上有一个名为“Window”的菜单项。该菜单项将使用由应用程序中运行的活动窗口列表组成的菜单项子菜单动态更新自身。我创建了一个 ViewManager,每个 View 都会向其注册以编译活动窗口列表。

我尝试在 XAML 中执行此操作,但在单击“窗口”时出现错误

<MenuItem Header="Window">
    <ItemsControl ItemsSource="{Binding ViewMgr.Views}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Command" Value="{Binding DataContext.OpenWindowCmd , 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
                <Setter Property="CommandParameter" Value="{Binding}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</MenuItem>

如何使用 MVVM 样式的数据绑定和命令在 XAML 中的菜单上创建动态更新的菜单项列表?

【问题讨论】:

  • 你遇到了什么错误?尝试获取错误消息的详细信息并将其发布,这通常可以帮助找到解决方案

标签: c# wpf xaml mvvm


【解决方案1】:

您正在添加一个新的 ItemsControl 作为菜单项的单个子项,而不是将每个视图添加为菜单项本身的一个子项。您可能会收到错误,因为样式 TargetType 不匹配。 MenuItem 继承自 ItemsControl 本身并公开属性 ItemsSource。请尝试以下操作:

<MenuItem ItemsSource="{Binding ViewMgr.Views}" DisplayMemberPath="Title">

    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding DataContext.OpenWindowCmd,  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
            <Setter Property="CommandParameter" Value="{Binding}"/>
        </Style>
    </MenuItem.ItemContainerStyle>

</MenuItem>

【讨论】:

  • 感谢您的帮助,它成功了!为了清楚起见,我编辑了您的 xaml 并添加了标题,并修复了错误的 Menu.ItemContainerStyle 结束标记。
  • 嗯,你想补充什么?我可以编辑帖子......不过,结束标签对我来说似乎很好......干杯!
  • 应该是
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多