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