3

イベントハンドラーを追加および削除していて、追加のパラメーターが必要な場合、これをどのように実行しますか?以下のコードは私が欲しいもののようなものですが、明らかに機能しません。

これについてどうしますか?-ハンドラーも削除する必要があるため、デリゲートやラムダを使用できないのは面倒です。

    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、予期される2つのパラメーターのみを受け入れ、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のコードでラムダのバインドが適切に解除されない場合は、を保持して、バインドされた正確なDictionary<DependencyObject, EventHandler>ラムダを取得し、それに応じてバインドを解除できます。

于 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 に答える