如何在XAML中创建“窗口”菜单?

时间:2014-02-10 06:40:00

标签: c# wpf xaml mvvm

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

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

<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中的菜单上创建动态更新的菜单项列表?

1 个答案:

答案 0 :(得分: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>