gpt4 book ai didi

c# - 添加和删​​除具有附加参数的处理程序?

转载 作者:行者123 更新时间:2023-11-30 15:37:25 25 4
gpt4 key购买 nike

当您添加和删除 事件处理程序并且您想要有额外的参数时,您将如何着手进行此操作?下面的代码就像我想要的东西,但显然不起作用。

你会怎么做? - 我不能使用委托(delegate)或 lambda 很麻烦,因为我还需要删除处理程序。

    private static void IsDefaultChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
if ((bool)args.NewValue)
{
Window.Current.CoreWindow.KeyUp += CoreWindowOnKeyUp(dependencyObject);
}
else
{
Window.Current.CoreWindow.KeyUp -= CoreWindowOnKeyUp(dependencyObject);
}

}

private static void CoreWindowOnKeyUp(CoreWindow sender, KeyEventArgs args, DependencyObject dependencyObject)
{
((ICommand)dependencyObject.GetValue(Button.CommandProperty)).Execute(null);
}

最佳答案

你可以做的是:

  • 收藏一些 DependencyObject您在 IsDefaultChanged 中添加/删除的内容方法。
  • 修改您的 CoreWindowOnKeyUp handler 所以它只接受预期的两个参数,并查询 DependencyObject 的集合本身。绑定(bind)此事件一次,不要解除绑定(bind)。

即不是为每个当前依赖对象创建一个带有处理程序的事件,而是一个带有单个处理程序的事件,该处理程序查询当前依赖对象的集合。

HashTable<DependencyObject> current = new HashTable<DependencyObject>();

// Bound as before
private static void IsDefaultChanged(
DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs args)
{
if ((bool)args.NewValue)
current.Add(dependencyObject);
else
current.Remove(dependencyObject);
}

// Permanently bound, once.
private static void CoreWindowOnKeyUp(CoreWindow sender, KeyEventArgs args)
{
foreach(var do in current)
{
((ICommand)do.GetValue(Button.CommandProperty)).Execute(null);
}
}

或者,如果 Richard 的代码没有正确取消绑定(bind) lambda,您可以保留一个 Dictionary<DependencyObject, EventHandler>因此您可以检索准确绑定(bind)的 lambda 并相应地解除绑定(bind)。

关于c# - 添加和删​​除具有附加参数的处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com