有时候在开发过程中,框架提供的通信机制可能无法满足我们的要求,这时候我们自己可以定义一个全局的事件注册器,类似于观察者模式,下面直接上代码。
public static class EventDispatcher
{
private static Dictionary<string, Action<object>> _actions;
static EventDispatcher()
{
_actions = new Dictionary<string, Action<object>>();
}
//添加一个事件
public static void AddAction(string key, Action<object> action)
{
if (!_actions.ContainsKey(key))
{
_actions.Add(key, action);
}
else
{
throw new Exception($"event key{key} has existed");
}
}
//移除
public static void RemoveAction(string key)
{
if (_actions.ContainsKey(key))
{
_actions.Remove(key);
}
}
//判断是否存在
public static bool IsExist(string key)
{
return _actions.Keys.Contains(key);
}
//激活
public static async Task Dispatch(string key, object value)
{
await Task.Run(()=> {
Console.WriteLine("Dispatch");
Console.WriteLine(string.Join(",", _actions.Keys));
if (_actions.ContainsKey(key))
{
var act = _actions[key];
act.Invoke(value);
}
});
}
}
简单解释一下,定义一个全局静态类EventDispatcher
,方便其他类调用,当我们需要做某些操作的时候,我们调用AddAction
方法,将需要操作的方法添加进去,在合适的时候再调用Dispatch
方法,进行唤起,这里注意一点,就是每次注册方法的时候,调用一下IsExist
,看是否存在,防止发生意外。
简单演示一下:
我们先进行事件注册:
private async Task OnCreateIceBoxClick()
{
//注册一个添加冰箱完成后刷新树节点的事件
if (!EventDispatcher.IsExist("IceBoxNodeRefsh"))
{
EventDispatcher.AddAction("IceBoxNodeRefsh", IceBoxNodeRefsh);
}
await Task.CompletedTask;
}
//刷新树的冰箱节点
private async void IceBoxNodeRefsh(object Argument)
{
await InvokeAsync(
async () => {
await OnInitializedAsync();
await OnExpandNode(_Roomite);
}
);
}
然后再需要的地方调用:
//如果是再树节点执行的添加操作 就进行刷新
if (EventDispatcher.IsExist("IceBoxNodeRefsh"))
{
await EventDispatcher.Dispatch("IceBoxNodeRefsh","");
}