WPF:将命令添加到通过绑定菜单项自动生成

Posted

技术标签:

【中文标题】WPF:将命令添加到通过绑定菜单项自动生成【英文标题】:WPF: Add a command to auto-generated by binding menu items 【发布时间】:2012-12-15 10:45:39 【问题描述】:

使用MVVM。我创建了单独的菜单“最近的文件”,它从绑定中获取其项目。看起来是这样的:

        <MenuItem Header="_Recent files" ItemsSource="Binding RecentFiles, Converter=StaticResource RecentFilesToListOfStringsConverter, Mode=OneWay" >
        </MenuItem>

现在,我想将命令添加到每个自动生成的项目中,它应该将路径作为命令参数并通过单击执行导入文件操作。

您能否建议如何以 MVVM 方式完成?

【问题讨论】:

【参考方案1】:

再次,我自己找到了解决方案。我试图以错误的方式输入命令,如下所示,但它不起作用:

            <MenuItem Header="_Recent files" ItemsSource="Binding RecentFiles, Converter=StaticResource RecentFilesToListOfStringsConverter, Mode=OneWay" >
            <MenuItem.ItemContainerStyle>
                <Style TargetType="x:Type MenuItem">
                    <Setter Property="Command" Value="Binding ImportRecentItemCommand" />
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>

这是正确的方法。还是不明白它是怎么工作的,必须深入学习WPF!

            <MenuItem Header="_Recent files" ItemsSource="Binding RecentFiles, Converter=StaticResource RecentFilesToListOfStringsConverter, Mode=OneWay" >
            <MenuItem.ItemContainerStyle>
                <Style TargetType="x:Type MenuItem">
                    <Setter Property="Command" Value="Binding DataContext.ImportRecentItemCommand, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=x:Type MenuItem, AncestorLevel=1" />
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>

编辑:最终版本

XAML:

            <MenuItem Header="_Recent files" ItemsSource="Binding RecentFiles, Converter=StaticResource RecentFilesToListOfStringsConverter, Mode=OneWay" >
            <MenuItem.ItemContainerStyle>
                <Style TargetType="x:Type MenuItem">
                    <Setter Property="Command" Value="Binding DataContext.ImportRecentItemCommand, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=x:Type MenuItem, AncestorLevel=1" />
                    <Setter Property="CommandParameter" Value="Binding" />
                </Style>
            </MenuItem.ItemContainerStyle>
        </MenuItem>

ViewModel:使用了 MVVM Light Toolkit,RelayCommand 从那里开始:

        private ICommand _importRecentItemCommand;

        public ICommand ImportRecentItemCommand
        
            get  return _importRecentItemCommand ?? (_importRecentItemCommand = new RelayCommand<object>(ImportRecentItemCommandExecuted)); 
        

        private void ImportRecentItemCommandExecuted(object parameter)
        
            MessageBox.Show(parameter.ToString());
        

享受

【讨论】:

以上是关于WPF:将命令添加到通过绑定菜单项自动生成的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将 ListBox ContextMenu 的命令参数绑定到 ListBox 的选定项

C# WPF 菜单条控制器

WPF中使用 menu控件自动生成菜单,但是到窗体变小时,菜单栏显示不全了,怎么解决

将 WPF 快捷键绑定到 ViewModel 中的命令

来自父项控件的 WPF 对象绑定

怎样将鼠标右键菜单项设置成自动分栏显示?