在经典类库中,我可以这样做:
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; }
}
我应该如何实施删除部分?
答案 0 :(得分: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); }
}
答案 1 :(得分: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);
}