WinRT でカスタム イベント用のクラスを作成しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using System.Threading.Tasks;
namespace BA_Lib
{
public class RTEventHandler<T>
{
private EventRegistrationTokenTable<EventHandler<T>> m_EventTokenTable = null;
public event EventHandler<T> Event
{
add { EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).AddEventHandler(value); return; }
remove { EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).RemoveEventHandler(value); }
}
public void Fire(T argument)
{
EventHandler<T> temp = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).InvocationList;
if (temp != null)
temp(null, argument);
}
public void Fire(object sender,T argument)
{
EventHandler<T> temp = EventRegistrationTokenTable<EventHandler<T>>.GetOrCreateEventRegistrationTokenTable(ref m_EventTokenTable).InvocationList;
if (temp != null)
temp(sender, argument);
}
}
}
このクラスを使用して、次のように独自のイベントへのカスタム バインディングを作成します。
public RTEventHandler<int> Count{get;set;}
public void init(){Count=new RTEventHandler<int>();}
そして、他のクラスから:
EventHolder.Count.Event+=myEventHandler;
EventHolder.Count.Event-=myEventHandler;
これは魅力のように機能しますが、トークンを使用してイベントから登録解除しようとすると、テーブルのままになります。これにより、イベント ハンドラーが蓄積され、複数回起動されるため、望ましくない動作が発生します。