当您添加删除事件处理程序并希望获得其他参数时,如何执行此操作?下面的代码就像我想要的东西,但显然不起作用。
你会怎么做? - 我不能使用委托或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);
}
答案 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;
}
}