C# 将命令绑定到ListView中上下文菜单中的viewModel

C# 将命令绑定到ListView中上下文菜单中的viewModel,c#,listview,binding,collectionviewsource,C#,Listview,Binding,Collectionviewsource,我试图将上下文菜单项绑定到我在ViewModel中定义的命令。上下文菜单位于ListView中,我也绑定到了CollectionViewSource,我认为这就是问题的原因 我已经成功地将listView集合中的选定项绑定到我的ViewModel,但是当我尝试使用相同的方法将上下文菜单项命令绑定到我的ViewModel时,它不起作用。我希望任何人都有时间通读下面所有的代码,让我知道我做错了什么 另外,为了不泄露申请的内容,我不得不更改一些名字 在我的ViewModel中,我定义了以下内容: pu

我试图将上下文菜单项绑定到我在ViewModel中定义的命令。上下文菜单位于ListView中,我也绑定到了CollectionViewSource,我认为这就是问题的原因

我已经成功地将listView集合中的选定项绑定到我的ViewModel,但是当我尝试使用相同的方法将上下文菜单项命令绑定到我的ViewModel时,它不起作用。我希望任何人都有时间通读下面所有的代码,让我知道我做错了什么

另外,为了不泄露申请的内容,我不得不更改一些名字

在我的ViewModel中,我定义了以下内容:

public ObservableCollection<ListItemViewModel> ListViewItemViewModels {get; set;}

public MyListItem SelectedListItemViewModel {get; set;}

private RelayCommand _runCommand;
public ICommand RunCommand {
  get {
     return _runCommand ??
       ( _runCommand = new RelayCommand( param => RunReport(), param => CanRunReport ) );
  }
}

private void RunReport() {
    Logger.Debug("Run report");
}
公共ObservableCollection ListViewItemViewModels{get;set;} 公共MyListItem SelectedListItemViewModel{get;set;} 专用中继命令_runCommand; 公共ICommand运行命令{ 得到{ 返回\u运行命令?? (_runCommand=new RelayCommand(param=>RunReport(),param=>CanRunReport)); } } 私有void RunReport(){ 调试(“运行报告”); } 然后,在我看来,我将upp设置为ListView,如下所示:

<ListView ...>
    <ListView.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding}" />
    </ListView.Resources>

    ...

   <ListView.ContextMenu>
       <ContextMenu Name="ListViewContextMenu">
          <MenuItem Header="Run" Command="{Binding Source={StaticResource proxy}, Path=Data.RunCommand}"/>
       </ContextMenu>
   </ListView.ContextMenu>


    ...

</ListView>

CollectionViewSource的定义如下:

<ListView ...>
    <ListView.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding}" />
    </ListView.Resources>

    ...

   <ListView.ContextMenu>
       <ContextMenu Name="ListViewContextMenu">
          <MenuItem Header="Run" Command="{Binding Source={StaticResource proxy}, Path=Data.RunCommand}"/>
       </ContextMenu>
   </ListView.ContextMenu>


    ...

</ListView>

问题的原因是
上下文菜单
不是
列表视图
的逻辑树或可视树的一部分,因此
相对资源
/
FindAncestor
不起作用,并且
数据上下文
不被继承

我在几个月前发布了此问题,您可以按如下方式使用它:

<ListView ...>
    <ListView.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding}" />
    </ListView.Resources>

    ...

   <ListView.ContextMenu>
       <ContextMenu Name="ListViewContextMenu">
          <MenuItem Header="Run" Command="{Binding Source={StaticResource proxy}, Path=Data.RunCommand}"/>
       </ContextMenu>
   </ListView.ContextMenu>


    ...

</ListView>

...
...

非常感谢!成功了!我所要做的就是在BindingProxy中绑定ListView的祖先,就像我在ListView中绑定SelectedItem一样