[英]Pass command parameter from the xaml
我尝试做这样的事情:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding RemoveRow}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
但我总是得到null(我也试过SelectedIndex和SelectedValue)
如果我将以下参数传递给执行代码,它的工作原理如下:
<MenuItem Command="{Binding RemoveRow}" CommandParameter="1">
在CommandParameter中尝试这样的事情,
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="MyHeader"
Command="{Binding MyCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>
我已经测试了它,它应该工作。
它不起作用,因为ContextMenu
不是DataGrid
的可视化或逻辑树的一部分,因此它不继承DataContext
。
据我所知,只使用内置的绑定系统就可以轻松解决这个问题。 但是,使用此处说明的简单“代理”类,您可以解决此问题:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
但是,您仍有问题: ElementName=myGrid
不起作用(同样,因为ContextMenu
不在DataGrid
的可视或逻辑树中,因此它不在同一名称范围内)。 一个简单的解决方案是将DataGrid
的SelectedItem
绑定到ViewModel的属性,并使用该属性而不是命令参数:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}"
SelectedItem="{Binding SelectedItem}">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.