我有一个特定于wpf的问题。我正在尝试从Datagrid中删除一行,方法是定义一个Keybinding,它将Datagrid的选定Row作为CommandParameter传递给Command。
这是我的Keybinding:
<UserControl.Resources >
<Commands:CommandReference x:Key="deleteKey" Command="{Binding DeleteSelectedCommand}"/>
</UserControl.Resources>
<UserControl.InputBindings>
<KeyBinding Key="D" Modifiers="Control" Command="{StaticResource deleteKey}"/>
</UserControl.InputBindings>
我知道这基本上有效,因为我可以调试到DeleteSelectedCommand。但是有一个异常,因为DeleteSelectedCommand会将Datagrid的一行预先删除为Call Parameter。
如何通过Keybinding传递SelectedRow?
我希望只在XAML中执行此操作,如果可能的话,不要更改Code Behind。
答案 0 :(得分:11)
如果您的DataGrid有一个名称,您可以尝试以这种方式定位:
<KeyBinding Key="D" Modifiers="Control" Command="{StaticResource deleteKey}"
CommandParameter="{Binding SelectedItem, ElementName=myDataGrid}"/>
(注意:CommandParameter
只能在.NET 4中绑定(可能是以下版本),因为它已被更改为依赖项属性)
答案 1 :(得分:2)
不是尝试使用命令参数,而是创建一个属性来存储选定的行:
private Model row;
public Model Row
{
get { return row; }
set
{
if (row != value)
{
row = value;
base.RaisePropertyChanged("Row");
}
}
}
其中Model是网格显示的对象的类。 在datagrid上添加selectedItem属性以使用属性:
<DataGrid SelectedItem="{Binding Row, UpdateSourceTrigger=PropertyChanged}"/>
然后让你的命令通过该行传递给方法:
public ICommand DeleteSelectedCommand
{
get
{
return new RelayCommand<string>((s) => DeleteRow(Row));
}
}
和你的键绑定:
<DataGrid.InputBindings>
<KeyBinding Key="Delete" Command="{Binding DeleteSelectedCommand}" />
</DataGrid.InputBindings>
希望有所帮助!
答案 2 :(得分:0)
在KeyBinding上有一个名为CommandParameter的属性,此处设置的任何内容都将被传递。然而,它不是依赖属性(在3.5中,对于4.0,参见H.B.的答案),正如您在命令中找到的那样,输入绑定不在继承树中,因此他们不打扰使它们成为DP。
您需要使用与绑定命令相同的解决方案。 这里有一个例子,http://www.wpfmentor.com/2009/01/how-to-add-binding-to-commandparameter.html
<DataGrid x:Name="grid">
<DataGrid.Resources>
<WpfSandBox:DataResource x:Key="cp" BindingTarget="{Binding SelectedItem, ElementName=grid}" />
</DataGrid.Resources>
<DataGrid.InputBindings>
<KeyBinding Key="q" Modifiers="Control" Command="{x:Static WpfSandBox:Commands.Delete}">
<KeyBinding.CommandParameter>
<WpfSandBox:DataResourceBinding DataResource="{StaticResource cp}"/>
</KeyBinding.CommandParameter>
</KeyBinding>
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Value}" />
<DataGridTextColumn Binding="{Binding Value}" />
</DataGrid.Columns>
</DataGrid>