如何在ViewModel中具有Delete ICommand定义的DataGrid列中执行Delete按钮

问题描述

Xaml代码 Datagrid Button的其他什么属性应用于触发CmdDeleteUser ICommand属性。 Datagrid行被选中,但是“删除”按钮不起作用。 '''

<DataGridTemplateColumn Header="Delete Record" IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate >
               <DataTemplate>
                   <Button Width="60" Margin="2" Command="{Binding CmdDeleteUser}"  Content="Delete" />
               </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>

'''

viewmodel代码 '''

public ICommand CmdDeleteUser
        {
            get
            {
                return new DelegateCommand(DeleteUser);
            }
        }
       
    
    private void DeleteUser()
    {
        if (null != SelectedCustomer)
        {
            customer.Remove(SelectedCustomer);
        }
        try
        {
            con = new sqlConnection(connectionString);
            con.open();
            cmd = new sqlCommand($"Delete from Customer where Id='{Convert.ToInt32(SelectedCustomer.id)}'",con);
            cmd.ExecuteNonQuery();
            Customer current = customer.Where(x => x.id == SelectedCustomer.id).FirstOrDefault();
            customer.Remove(current);
            

        }
        catch (Exception)
        {
        }
        finally
        {
            con.Close();                
        }
    }

'''

解决方法

在Listview内部,您可以使用RelativeSource访问ViewModel中的命令:

Command="{Binding DataContext.CmdDeleteUser,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding}

AncestorType取决于控件的类型,该控件具有所需的BindingContext。

问题是,您尝试在DataGrid中绑定CmdDeleteUser,同时在ViewModel中定义了Command,但如果使用ItemsSource,则DataGrid的BindingContext不是ViewModel。