3

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

你会怎么做?- 我不能使用委托或 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);
    }
4

2 回答 2

3

你可以做的是:

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

即,不是让每个当前依赖对象的事件都具有处理程序,而是使用单个处理程序来查询当前依赖对象的集合的事件。

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 的代码没有正确解除绑定 lambda,您可以保留 aDictionary<DependencyObject, EventHandler>以便检索已绑定的确切lambda 并相应地解除绑定。

于 2012-09-27T15:46:54.250 回答
1

您可以使用闭包来关闭匿名委托中的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; 
    } 

} 
于 2012-09-27T15:42:52.623 回答