我的目标是在 WPF 中创建一个导航菜单。
导航项是使用节点在视图模型中构建的。
SelectedSubItem
菜单将显示所选节点的内容。
这是我迄今为止构建的内容:
现在我需要将所选内容呈现MenuItem
给ContentPresenter
- 这就是我遇到问题的地方。
这是我当前的代码
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
控件没有选定项的概念,因为它的MenuItem
s 本质上是在单击时应执行操作的按钮。您可以将该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
命令实现。
然后,您可以调整样式以将命令绑定到主视图模型(使用ElementName
或RelativeSource
绑定到数据上下文)并将单击的视图模型绑定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
您的绑定ContentPresenter
到Selected
主视图模型上的属性。
<ContentPresenter Grid.Row="1" Content="{Binding ElementName=NavigationTreeView, Path=Selected}" />
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句