我正在使用MVVM做我的第一个应用程序。我在“View”中声明了Datagrid。代码XAML如下:
<DataGridTemplateColumn Header="delete"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type> UserControl},Mode=FindAncestor}, Path=DataContext.ClickCommand}"> Content="X" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns>> </DataGrid>
在我的ViewModel类中,我可以通过代码的一部分单击“删除”按钮来运行我想要的功能:
public ICommand ClickCommand => _clickCommand ?? (_clickCommand = new CommandHandler(Delete, _canExecute)); public void Delete() { // DataTable.Rows.RemoveAt(); }
我有问题,因为我无法获得选择行的索引。 datagrid中的数据源是dataTable。
你有什么想法怎么做?
我已尝试通过按钮命令传递参数,但我不能使它有效。
答案 0 :(得分:3)
Xmal代码
<Button Command="{Binding Path=DataContext.ViewCommand,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding Id}" Content="X" Background="Chocolate"/>
代码隐藏代码
public RelayCommand DeleteCommand
{
get
{
return new RelayCommand(p => Delete(p));
}
}
public void Delete(string id)
{
// DataTable.Rows.RemoveAt();
}
这是您可以在该cmd参数中传递任何内容的示例。
接力cmd
public class RelayCommand : ICommand
{
private Action<object> action;
private Func<bool> canFuncPerform;
public event EventHandler CanExecuteChanged;
public RelayCommand(Action<object> executeMethod)
{
action = executeMethod;
}
public RelayCommand(Action<object> executeMethod, Func<bool> canExecuteMethod)
{
action = executeMethod;
canFuncPerform = canExecuteMethod;
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged(this, EventArgs.Empty);
}
public bool CanExecute(object parameter)
{
if (canFuncPerform != null)
{
return canFuncPerform();
}
if (action != null)
{
return true;
}
return false;
}
public void Execute(object parameter)
{
if (action != null)
{
action(parameter);
}
}
}
答案 1 :(得分:1)
您不应该依赖所选项目。而是将当前行项目传递为CommandParameter
:
<DataGridTemplateColumn Header="delete">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl},Mode=FindAncestor}, Path=DataContext.ClickCommand}"
CommandParameter="{Binding}"
Content="X" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
然后,当然,使用不丢弃命令参数的ICommand
实现,并使用它来标识要删除的行。