背景:自定义控件的消息传递和方法的调用可以使用聚合器来进行
定义聚合器:
cs
public class EventAggregator
{
public static ConcurrentDictionary<Type, List<Action<object>>> _handles = new ConcurrentDictionary<Type, List<Action<object>>>();
// 订阅方法
public void Register<T> (Action<object> action)
{
if (!_handles.ContainsKey(typeof (T)))
{
_handles[typeof (T)] = new List<Action<object>> ();
}
_handles[typeof(T)].Add(action);
Debug.WriteLine(_handles[typeof(T)].Count);
}
// 给数据给调用的方法
public void Send<T> (object obj)
{
if (_handles.ContainsKey(typeof(T)))
{
foreach (var actionin in _handles[typeof(T)])
{
actionin?.Invoke(obj);
}
}
}
}
使用单例模式访问聚合器:
cs
public class EventAggregatorRepository
{
public EventAggregator eventAggregator;
private static EventAggregatorRepository aggregatorRepository;
private static object _lock = new object();
public EventAggregatorRepository()
{
eventAggregator = new EventAggregator();
}
// 单例,只要一个事件聚合器
public static EventAggregatorRepository GetInstance()
{
if (aggregatorRepository == null)
{
lock (_lock)
{
if (aggregatorRepository == null)
{
aggregatorRepository = new EventAggregatorRepository();
}
}
}
return aggregatorRepository;
}
}
在发送消息的控件中:
cs
public SendMsgControlViewModel()
{
SendMsgCommand = new RelayCommand<Student>(SendMsg);
}
private void SendMsg(object t)
{
Student student = new Student()
{
Name = "梨花",
Id = 12,
};
EventAggregatorRepository.GetInstance().eventAggregator.Send<Student>(student);
}
接收消息的控件中
cs
public MainWindowViewModel()
{
EventAggregatorRepository.GetInstance().eventAggregator.Register<Student>(ShowData);
}
private void ShowData(object obj)
{
Student student = (Student)obj;
Receive = student.Name; // 需要显示的属性绑定
MessageBox.Show(Receive);
}