1

クラシック クラス ライブラリでは、次のことができます。

public event EventHandler Changed
{
  add { decorated.Changed += value; }
  remove { decorated.Changed -= value; }
}

今、winRT クラスを使用すると、コンパイラはそのようなコードについて不平を言います。「追加」にパッチを当てることができましたが、削除に行き詰まりました:

public event EventHandler Changed
{
  add { return decorated.Changed += value; }
  remove { decorated.Changed -= value; }
}

削除部分を実装するにはどうすればよいですか?

4

2 に答える 2

1

System.Runtime.InteropServices.WindowsRuntime.EventRegistrationTokenTable<T>

マネージ コードでの Windows ランタイム イベントの実装をサポートするために、デリゲートとイベント トークン間のマッピングを格納します。

イベントの追加と削除を手動で管理する必要がある場合は、このタイプを使用します。

このテーブルのインスタンスには、イベントに追加されたイベント ハンドラーを表すデリゲートが格納されます。イベントを発生させるには、プロパティによって返されるデリゲートを呼び出しInvocationListます (そうでない場合) null。イベントごとに、このテーブルのインスタンスが必要です。

例えば、

private EventRegistrationTokenTable<EventHandler<Object>> _changed
     = new EventRegistrationTokenTable<EventHandler<Object>>();

public event EventHandler<Object> Changed
{
    add    { return _changed.AddEventHandler(value); }
    remove { _changed.RemoveEventHandler(value);     }
}
于 2012-08-02T19:24:45.350 に答える
0

1 つの解決策は、偽のバッキング イベントとルックアップ ディクショナリを作成して、イベントの転送に必要な情報を格納することです。例えば:

public event EventHandler<Object> Changed
{
  add
  {
    // get fake token so that we can return something and/or unsubscribe
    EventRegistrationToken token = _changed.AddEventHandler(value);
    // subscribe and store the token-handler pair
    _otherClass.Event += value;
    _dictionary[token] = value;
    return token;
  }
  remove
  {
    // recall value and remove from dictionary
    _otherClass.Event -= _dictionary[value];
    _dictionary.Remove(value);
    // remove it from the "fake" event
    _changed.RemoveEventHandler(value);
  }
}

private EventRegistrationTokenTable<EventHandler<Object>> _changed;
private Dictionary<EventRegistrationToken, EventHandler<Object>> _dictionary;

または、WinRT クラスから CLR イベントをサブスクライブし、単純に CLR イベントを WinRT サブスクライバーに転送する方が簡単な場合があります。あなたが尋ねたことから多かれ少なかれ流れを逆にします:

public WinRtObject()
{
  _otherClass.Event += (sender, o) => OnChanged(o);
}

public event EventHandler<Object> Changed;

private void OnChanged(object e)
{
  EventHandler<object> handler = Changed;
  if (handler != null)
    handler(this, e);
}
于 2013-10-23T19:44:34.113 に答える