C#WPF中的Prism的事件聚合器------------个人笔记
如果没有 Command事件绑定的一些 控件 我们得用Interactivity
但是Prism 里面自带有Interactivity里面的功能 //拓展
为什么要叫事件聚合器?
ea.GetEvent<MessageEvent>() 这句话的意思是 从一个地方获取一个对象:事件对象的容器
刚开始IEventAggregator ea 这个容器是 空的 他GetEvent 一个 MessageEvent 里面就有这个对象了
我们执行的委托 就属于MessageEvent 只要涉及 Publish的时候 就会找我们执行的那个委托
逻辑类似:IEventAggregator ea(注册了一个 MessageEvent (只要用了Publish(就会触发我们在Subscribe写的委托)))
怎么注入的一个对象 这个 IEventAggregator ea这个对象
IOC思想 框架需要两个东西 要把各个模块进行解耦合 没有这个IeventAggreator 就会耦合很重
需要去定义EventAggregator ..... 会很麻烦
所以就提供了 IOC容器 Unity
所以就提供了一个很大的容器 有着全局的实例 里面可以有 EventAggregator 我们用IOC 就可以去获取他
Unity(EventAggregator)
注入是什么意思? 逻辑是什么?
我们第一步从入口 在Window APP.XAML.cs的入口 获取了我们的窗口的对象
我们窗口对象会有个构造函数 那我们在MainWindow的构造函数处 我们已经写了 一个 IEventAggregator ea 他就会去
注册, 通过IOC容器实例化 在通过丢给构造函数 然后我们在构造 注入进来 我们就拿到了 IEventAggregator ea 这个对象
前提是 两个必须是 View 与ViewModel的关系
事件聚合器 有用到一些 注入的思想 IOC思想
MVVmLight 数据-行为-模块之间的 数据交换 是用 Messenger
Prism有个类似的功能: 叫事件聚合器
要在View 页面的 Cs 中的 构造函数的参数加入(IEventAggregator ea)
之后在下面注册
例如: 在MainWindow中 在他的MainWindow.Xaml.cs
public MainWindow(IEventAggregator ea)
{
InitializeComponent();
//注册 被动执行的
ea.GetEvent<MessageEvent>().Subscribe(()=> {
//等待触发的操作 业务逻辑等
});
}
这个注册是被动执行的
MessageEvent 中要继承 PubSubEvent 可以有 Subscribe这个方法 就可以注册了
这边注册了 之后在ViewModel页面的 构造函数处 注入(IEventAggregator ea)
代码:
IEventAggregator _ea;
public MainWindowViewModel(IEventAggregator ea)
{
_ea = ea;
});
}
之后把他拿出来
做成 IEventAggregator —ea; 在构造函数中 —ea=ea; 把我们构造函数的 IEventAggregator ea 的拿出来
之后在触发的事件那边 的DelegateCommand中 调用 一个我们触发的事件
在那个事件里面 我们需要些一个触发 这个触发会使我们在MainWIndow中所写的注册 会触发一次
代码:
public ICommand ClickCommand
{
get => new DelegateCommand<object>(ClickButton, CanExecute);
}
private void ClickButton(object a)
{
//通过命令处理按钮的可执行情况
_ea.GetEvent<MessageEvent>().Publish();
}
private bool CanExecute(object b)
{
return true;
}
如果需要传参过去的话 就需要在MessageEvent这个 类继承的 PubSubEvent<String>
其他填入对应需要的参数即可;
在触发的时候 我们经常用到 task.run 多线程 我们会遇到一个 线程被另外一个占用 我们可以在 注册的地方
我们在Subscribe的重载中 找到 一个 action action + 一个 ThreadOption的重载
代码:
//注册 被动执行的
ea.GetEvent<MessageEvent>().Subscribe(obj=> {
this.text.Text = obj;
},ThreadOption.UIThread);
ThreadOption 有三种线程设置
PublisherThread : 代表我们触发的时候 他在什么线程 我们就用什么线程执行这段代码 //但是有可能会报错 线程被另外一个占用
UIThread : 我们在UI线程中
BackgroundThread: 只能在后台线程中执行
数据集合绑定
集合变化的时候 =>我们需要在UI线程处理的就会用到 这个重载
当我们需要判断传过来的参数 CommandParameter 是否含有一个 元素/字符的时候 之后才需要执行我们的那个委托时候 就可以使用
ea.GetEvent<MessageEvent>().Subscribe(obj=> {
this.text.Text = obj;
},ThreadOption.UIThread,true,filter=>filter.Contains("A"));//这是判断是否有A这个字符 如果有 我们才执行这个委托
应用场景:
查询数据库数据时候,我们将获取的数据放到一个集合中 进行传值 我们需要显示 有21这个值的数据 并显示在页面DataGrid中时
我们可以使用这一个方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】