如何获取所选菜单项的内容?

LV98

问题总结

目标

我的目标是在 WPF 中创建一个导航菜单。

导航项是使用节点在视图模型中构建的。

SelectedSubItem菜单将显示所选节点的内容。

预期和实际结果

这是我迄今为止构建的内容:

在此处输入图片说明

错误

现在我需要将所选内容呈现MenuItemContentPresenter- 这就是我遇到问题的地方。

我试过的

这是我当前的代码

XAML

<!--Menu-->
<Menu x:Name="NavigationTreeView" IsMainMenu="True" ItemsSource="{Binding Navigation}" Grid.Row="0">
    <Menu.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Header" Value="{Binding Path=Title}" />
            <Setter Property="Template" Value="{StaticResource VsMenuTop}" />
        </Style>
        <HierarchicalDataTemplate DataType="{x:Type nav:PageViewModel}" ItemsSource="{Binding Children}" />
    </Menu.Resources>
</Menu>

<!--Content-->
<ContentPresenter Grid.Row="1" Content="{Binding ElementName=NavigationTreeView, Path=SelectedItem.Content}" />

这将不起作用,因为我无法在此处使用以下行将其绑定到 Menu:SelectedItem.Content- 并且 Menu 没有 property SelectedItem

选择

我的替代选择是使用ListView,因为它包含一个属性SelectedItem但最好我想使用Menu.

如何从分层数据模板中获取所选项目?

那个家伙

Menu控件没有选定项的概念,因为它的MenuItems 本质上是在单击时应执行操作的按钮。您可以将该IsCheckable属性设置true为能够检查像 a 这样的菜单项CheckBox,但我想这不适合您的用例。

由于您可能希望根据单击的菜单项显示不同的内容,因此您可以使用一个命令,该命令在您单击 a 时执行,MenuItem并获取相应的视图模型作为参数,并在视图模型上设置可以绑定的属性的ContentPresenter

在包含Selected属性的主视图模型中引入一个type 属性PageViewModel和一个Select命令Navigation该命令设置Selected属性。

public class MainViewModel : INotifyPropertyChanged
{
   public MainViewModel()
   {
      Selected = new RelayCommand<PageViewModel>(pageViewModel => Selected = pageViewModel);
      // ...other code.
   }

   public DelegateCommand<PageViewModel> Select { get; }
   
   private PageViewModel _selected;
   public PageViewModel Selected
   {
      get => _selected;
      private set
      {
         if (_selected == value)
            return;
   
         _selected = value;
         OnPropertyChanged();
      }
   }
   
   // ...other code.
}

您可以将 替换为您可以使用的RelayCommand命令实现。

然后,您可以调整样式以将命令绑定到主视图模型(使用ElementNameRelativeSource绑定到数据上下文)并将单击的视图模型绑定MenuItem为命令参数。通过这种方式,它被传递给命令,该命令将其设置为Selected.

<Style TargetType="{x:Type MenuItem}">
   <Setter Property="Header" Value="{Binding Path=Title}" />
   <Setter Property="Template" Value="{StaticResource VsMenuTop}" />
   <Setter Property="Command" Value="{Binding DataContext.Select, ElementName=NavigationTreeView}"/>
   <Setter Property="CommandParameter" Value="{Binding}"/>
</Style>

Content您的绑定ContentPresenterSelected主视图模型上的属性。

<ContentPresenter Grid.Row="1" Content="{Binding ElementName=NavigationTreeView, Path=Selected}" />

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章