不同界面间的数据交互,常用到的方式是委托。对于简单的业务逻辑,有的可以直接弹窗,在弹窗关闭之后更新处理。但当数据涉及到的界面是多个的时候,可能就会不好处理了。特别是当开发不断深入,直接更新就会显得越来越无力。那有没有一种方式可以处理呢?我们可以通过事件注册与通知的方式来处理。为了方便实现,我们设计了一个简单的接口,代码如下
/// <summary> /// 事件通知 /// </summary> public interface IEventNotify { #region 属性 /// <summary> /// 行为列表,保存注册的action /// </summary> List<Action<object>> NotifyActionList { get; set; } #endregion /// <summary> ///注册通知 /// </summary> /// <param name="action"></param> void RegisterNotify(Action<object> action); /// <summary> /// 取消通知 /// </summary> /// <param name="action"></param> void UnregisterNotify(Action<object> action); /// <summary> /// 通知 /// </summary> void Notify(object obj); }有了这个接口之后,需要实现的地方,只要实现该接口即可,示例代码如下
public class MyData : IEventNotify { public List<Action<object>> NotifyActionList { get; set; } public void Notify(object obj) { if (ListHelper.IsEmpty(NotifyActionList))//ListHelper代码在后面 { return; } foreach (var action in NotifyActionList) { action?.Invoke(obj); } } public void RegisterNotify(Action<object> action) { if (action == null) { return; } if (ListHelper.IsEmpty(NotifyActionList)) { NotifyActionList = new List<Action<object>>(); } NotifyActionList.Add(action); } public void UnregisterNotify(Action<object> action) { if (action == null || ListHelper.IsEmpty(NotifyActionList)) { return; } NotifyActionList.Remove(action); } }如果有大量的数据需要这样交互,那么可以把MyData当成基类,其他类直接继承即可。但是有时,因为A类已经继承自B类了,不可能再继承自MyData类,只能是去实现IEventNotify接口,这时RegisterNotify、UnregisterNotify、Notify等内部的代码需要重新实现一次,那有什么方式可以简化呢?
有的!
我们可以把RegisterNotify、UnregisterNotify、Notify的内部逻辑代码,作为IEventNotify的扩展方法,这样其他实现IEventNotify接口的地方,代码就可以简化了,代码如下
public static class EventNotifyExtension { #region RegisterNotifyDefault /// <summary> /// 注册通知 /// </summary> /// <param name="action"></param> public static void RegisterNotifyDefault(this IEventNotify eventNotifyInstance, Action<object> action) { if (action == null) { return; } if (ListHelper.IsEmpty(eventNotifyInstance.NotifyActionList)) { eventNotifyInstance.NotifyActionList = new List<Action<object>>(); } eventNotifyInstance.NotifyActionList.Add(action); } #endregion #region UnregisterNotifyDefault /// <summary> /// 注销通知 /// </summary> /// <param name="action"></param> public static void UnregisterNotifyDefault(this IEventNotify eventNotifyInstance, Action<object> action) { if (action == null || ListHelper.IsEmpty(eventNotifyInstance.NotifyActionList)) { return; } eventNotifyInstance.NotifyActionList.Remove(action); } #endregion #region NotifyDefault /// <summary> /// 通知 /// </summary> public static void NotifyDefault(this IEventNotify eventNotifyInstance, object obj) { if (ListHelper.IsEmpty(eventNotifyInstance.NotifyActionList)) { return; } foreach (var action in eventNotifyInstance.NotifyActionList) { action?.Invoke(obj); } } #endregion }有了这些扩展方法后,MyData的类的代码就可以简化了,新的实现代码如下
public class MyData : IEventNotify { public List<Action<object>> NotifyActionList { get; set; } public void Notify(object obj) { this.NotifyDefault(obj); } public void RegisterNotify(Action<object> action) { this.RegisterNotifyDefault(action); } public void UnregisterNotify(Action<object> action) { this.UnregisterNotifyDefault(action); } }当然,如果事件注册需要有其他的逻辑,那么就不用扩展方法,而自己去实现相关的逻辑。
ListHelper代码
/// <summary> /// list帮助类 /// </summary> public static class ListHelper { #region IsEmpty Function /// <summary> /// List是否为空,即为null或者Count为零 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns></returns> public static bool IsEmpty<T>(IList<T> list) { if (list == null || list.Count <= 0) { return true; } return false; } #endregion }示例效果图如下
示例的相关代码
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MyData myData = new MyData(); myData.RegisterNotify(UpdateData); Form2 form = new Form2(myData); form.ShowDialog(); } private void UpdateData(object obj) { textBox1.Text = $"{obj}"; } }
public partial class Form2 : Form { #region 内部变量 private MyData _myData = null; #endregion public Form2(MyData myData) { InitializeComponent(); _myData = myData; } private void textBox1_TextChanged(object sender, EventArgs e) { _myData.Notify(textBox1.Text); } }源码下载http://download.csdn.net/detail/xxdddail/9850746
转载请注明出处。