如何使用MVVM从DataGrid传递有关所选项的信息

时间:2017-04-04 14:21:41

标签: c# wpf xaml mvvm datagrid

我正在使用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。

你有什么想法怎么做?

我已尝试通过按钮命令传递参数,但我不能使它有效。

2 个答案:

答案 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实现,并使用它来标识要删除的行。