如何在DataGrid中移除Loaded事件处理程序?

3

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

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

但是我不知道如何在DataGrid加载后删除此处理程序。 以下代码无效。

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

请帮忙。谢谢。

1个回答

3

在需要明确移除事件监听器的情况下,您无法使用匿名处理程序。请尝试使用传统的方法:

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;
    }
}

还可以参考其他问题:


非常感谢。第二个解决方案正是我正在寻找的。 - user3496167
如何检查DataGridView上是否有事件监听器?如果没有,那么dataGrid.Loaded -= DataGridLoaded;会报错吗? - TiyebM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接