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

一种解决方案是创建一个虚假的支持事件和查找字典,用于存储转发事件所需的信息。例如:

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 回答