加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

wpf – 在Window的MenuItem上动态绑定到ViewModel命令

发布时间:2020-12-14 02:02:54 所属栏目:Windows 来源:网络整理
导读:使用MVVM结构处理 WPF应用程序. 我的窗口显示一个菜单和当前的ViewModel.在Menu的MenuItem之一上,我想列出当前ViewModel中的一些命令.菜单中列出的命令将根据ViewModel而改变. 我得到了这个工作得很好,但风格搞砸了 – Command MenuItems在另一个菜单框或其
使用MVVM结构处理 WPF应用程序.

我的窗口显示一个菜单和当前的ViewModel.在Menu的MenuItem之一上,我想列出当前ViewModel中的一些命令.菜单中列出的命令将根据ViewModel而改变.

我得到了这个工作得很好,但风格搞砸了 – Command MenuItems在另一个菜单框或其他内容.我会附上截图.

我在ViewViewModel中包装了ViewModel的ICommand对象(在本例中为RelayCommands),它在菜单上公开了我想要的Command和Display字符串.这些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>

目前的外观:

期望的外观:

解决方法

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

您需要做的不是定义DataTemplate,而是为MenuItem定义一个样式,您可以在其中设置与视图模型属性的绑定,并在父MenuItem上将此样式用作ItemContainerStyle:

<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>

有关项容器如何与ItemsControl控件一起使用的详细说明,请参见http://drwpf.com/blog/2008/03/25/itemscontrol-i-is-for-item-container/.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读