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

WPF:将命令添加到由绑定菜单项自动生成的,wpf,mvvm,binding,command,Wpf,Mvvm,Binding,Command,使用MVVM。我创建了单独的菜单“最近的文件”,它从绑定中获取项目。看起来是这样的: <MenuItem Header="_Recent files" ItemsSource="{Binding RecentFiles, Converter={StaticResource RecentFilesToListOfStringsConverter}, Mode=OneWay}" > </MenuItem> 现在,我想将命令添加到每个自动

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

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


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


你能建议一下如何用MVVM的方式来完成吗?

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

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


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());
        }
private ICommand\u importRecentItemCommand;
公共ICommand importRecentitem命令
{
获取{return _importRecentItemCommand??(_importRecentItemCommand=new RelayCommand(ImportRecentItemCommandExecuted));}
}
已执行私有void ImportRecentItemCommandExecuted(对象参数)
{
Show(parameter.ToString());
}
享受

        private ICommand _importRecentItemCommand;

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

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