wpf - 动态绑定(bind)到 Window 的 MenuItem 上的 ViewModel 命令

标签 wpf mvvm command datatemplate menuitem

使用 MVVM 结构处理 WPF 应用程序。

我的窗口显示一个菜单和当前的 ViewModel。在其中一个菜单的 MenuItems 上,我想列出在当前 ViewModel 中找到的一些命令。菜单中列出的命令将根据 ViewModel 发生变化。

我让它工作得很好,但风格搞砸了 - 命令菜单项在另一个菜单框或其他东西内。我会附上截图。

我将 ViewModel 的 ICommand 对象(在本例中为 RelayCommands)包装在 CommandViewModel 中,它在菜单上公开了我想要的命令和显示字符串。这些 CommandViewModel 在一个列表中:CurrentWorkspace.AdditionalOptionsCommands .

这是菜单的 XAML。就像我说的那样,它有效,它显示了正确的项目并执行了命令。显示不正确 - 谁能告诉我为什么以及如何修复它?请参阅屏幕截图。

<Menu>
    <MenuItem Header="_Additional Options..." ItemsSource="{Binding Path=CurrentWorkspace.AdditionalOptionsCommands}">
        <MenuItem.ItemTemplate>
            <DataTemplate DataType="{x:Type vm:CommandViewModel}">
                <MenuItem Header="{Binding Path=DisplayText}" Command="{Binding Path=Command}"/>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
    <MenuItem Header="_Testing">
        <MenuItem Header="This looks right" />
        <MenuItem Header="This looks right" />
    </MenuItem>   
</Menu>  

当前外观:

Current Appearance

所需外观:

Desired Appearance

最佳答案

这是因为当您通过 ItemsSource 指定菜单项时每个项目都会自动包装到 MenuItem目的。这样DataTemplate中定义的内容( MenuItem 元素)被包裹成另一个 MenuItem .

您需要做什么而不是定义 DataTemplate是为 MenuItem 定义样式您在其中设置与 View 模型属性的绑定(bind)并将此样式用作 ItemContainerStyle在父 MenuItem :

<Window.Resources>
    <Style x:Key="CommandMenuItemStyle"
           TargetType="{x:Type MenuItem}">
         <Setter Property="Header"
                 Value="{Binding Path=DisplayText}"/> 
         <Setter Property="Command"
                 Value="{Binding Path=Command}"/>
    </Style>
</Window.Resources>
...
<Menu>
    <MenuItem Header="_Additional Options..." 
              ItemsSource="{Binding Path=CurrentWorkspace.AdditionalOptionsCommands}" 
              ItemContainerStyle="{StaticResource CommandMenuItemStyle}"/>
    <MenuItem Header="_Testing">
        <MenuItem Header="This looks right" />
        <MenuItem Header="This looks right" />
    </MenuItem>   
</Menu>   

http://drwpf.com/blog/2008/03/25/itemscontrol-i-is-for-item-container/关于元素容器如何与 ItemsControl 一起工作的深入解释控制。

关于wpf - 动态绑定(bind)到 Window 的 MenuItem 上的 ViewModel 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6154391/

相关文章:

c# - 当对象用于显示时,组合框值在选择后消失

android - 链接多个用例

wpf - 在 MVVM 架构中应在何处以及如何管理选定的项目?

c# - 如何将控件填充到 ListViewItem 中的整个可用空间?

c# - CheckBox IsChecked 和 IsMouseOver

c# - 通知 ViewModel ValidatesOnExceptions 输入错误

c# - 无法将触发器设置为切换按钮

c# - 加载和保存 anchor 布局 - 可见性绑定(bind)

java - 如何从命令行运行具有多个包的 Selenium testNG 文件?

mysql - 使用变量名称创建数据库表