C# 如何在DataGrid中删除已加载的事件处理程序?

C# 如何在DataGrid中删除已加载的事件处理程序?,c#,wpf,datagrid,C#,Wpf,Datagrid,我试图在加载DataGrid时动态加载列,并在初始化中添加带有一些参数的事件处理程序 dataGrid.Loaded += (sender, args) => AddColumns(dataGrid, GetAttachedColumns(dataGrid)); 但不知道如何在加载DataGrid后删除此处理程序。以下代码不起作用 dataGrid.Loaded -= (sender, args) => AddColumns(dataGrid, GetAttachedColumns

我试图在加载
DataGrid
时动态加载列,并在初始化中添加带有一些参数的事件处理程序

dataGrid.Loaded += (sender, args) => AddColumns(dataGrid, GetAttachedColumns(dataGrid));
但不知道如何在加载DataGrid后删除此处理程序。以下代码不起作用

dataGrid.Loaded -= (sender, args) => AddColumns(dataGrid, GetAttachedColumns(dataGrid));

请帮忙。谢谢。

在需要显式删除事件侦听器的情况下,不能真正使用匿名处理程序。尝试一种简单的老方法:

private void DataGridLoaded(object sender, RoutedEventArgs args)
{
    AddColumns(dataGrid, GetAttachedColumns(dataGrid));
}
然后,您可以简单地添加/删除:

dataGrid.Loaded += DataGridLoaded;
dataGrid.Loaded -= DataGridLoaded;

或者,如果您真的想使用lambda表单,您可以保留成员变量中的引用。例如:

public class MyControl
{
    private RoutedEventHandler _handler;

    public void Subscribe()
    {
        _handler = (sender, args) => AddColumns(dataGrid, GetAttachedColumns(dataGrid));
        dataGrid.Loaded -= _handler;
    }

    public void Unsubscribe()
    {
        dataGrid.Loaded -= _handler;
    }
}
另见其他问题:


非常感谢。第二个解决方案正是我想要的。如何检查datagridview上是否有事件侦听器?如果没有,那么
dataGrid.Loaded-=DataGridLoaded给出一个错误?