如果沒有 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中時
我們可以使用這一個方法