问题描述
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>
'''
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。