添加和删​​除具有其他参数的处理程序?

时间:2012-09-27 15:34:56

标签: c#

当您添加删除事件处理程序并希望获得其他参数时,如何执行此操作?下面的代码就像我想要的东西,但显然不起作用。

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

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

2 个答案:

答案 0 :(得分:3)

你能做的是:

  • 保留您在DependencyObject方法中添加/删除的IsDefaultChanged的一些集合。
  • 修改您的CoreWindowOnKeyUp处理程序,使其仅接受预期的两个参数,并查询DependencyObject s本身的集合。绑定此事件一次,不要解除绑定。

即。而不是让每个当前依赖项对象都有一个带有处理程序的事件,你有一个事件,它有一个处理程序来查询集合中当前的依赖项对象。

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的代码没有正确解开lambdas,你可以保留Dictionary<DependencyObject, EventHandler>,这样你就可以检索绑定的 exact lambda并相应地取消绑定。

答案 1 :(得分:1)

您可以使用closure来关闭匿名委托中的dependencyObject,不确定语法是否已经开启,但是类似于。

private static void IsDefaultChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
{ 
    var func = (object sender,KeyEventArgs e) =>
    {
         ((ICommand)dependencyObject
             .GetValue(Button.CommandProperty)).Execute(null); 
    };
    if ((bool)args.NewValue) 
    { 
        Window.Current.CoreWindow.KeyUp += func; 
    } 
    else 
    { 
        Window.Current.CoreWindow.KeyUp -= func; 
    } 

}