WPF Prism框架合集(7.Mvvm)


導航

開發者博客
文檔學習
開發者平台

視頻教程地址

點擊觀看視頻教程

上一章回顧

  • ViewModelLocator?
  • Prism自動連接及約定
  • 如何修改默認約定
    本章節將講解Prism與常見的MVVM框架區別,以及在Prism當中如何在ViewModel實現基礎綁定、Command、事件聚合器等操作。

常見的MVVM框架

眾所周知, 如果你了解WPF當中的ICommand, INotifyPropertyChanged的作用, 就會發現
眾多框架都是基於這些進行擴展, 實現其通知、綁定、命令等功能。

對於不同的MVVM框架而言, 大體使用上會在聲明方式上的差異, 以及特定功能上的差別。
下面列舉了常用的3個MVVM框架,他們的一些差異。如下所示:

功能↓ / →框架名 Prism Mvvmlight Micorosoft.Toolkit.Mvvm
通知 BindableBase ViewModelBase ObservableObject
命令 DelegateCommand RelayCommand Async/RelayCommand
聚合器 IEventAggregator IMessenger IMessenger
模塊化 × ×
容器 × ×
依賴注入 × ×
導航 × ×
對話 × ×

正如你所見, 各個框架之間都有各自的通知、綁定、事件聚合器等基礎的功能, 而Prsim自帶的依賴注入、容器、以及導航會話等功能, 可以為你提供更加強大的功能。

當然,在實際的開發過程當中, 可以根據實際的功能需求, 對不同的框架選型, 同時這也需要你對各個框架之間的優缺點進行判斷。

那么, 下面將主要介紹Prism當中的通知、綁定等功能。

BindableBase

如果在此之前, 你用類型mvvmlight框架, ViewModel繼承的類如下:

    public class TestViewModel : ViewModelBase
    {
        private string _message;

        public string Message
        {
            get { return _message; }
            set { _message = value; RaisePropertyChanged(); }
        }
    }

Prism當中, 你需要繼承於BindableBase, 如下所示:

    public class TestViewModel : BindableBase
    {
        private string _message;

        public string Message
        {
            get { return _message; }
            set { _message = value; RaisePropertyChanged(); }
        }
    }

Command

在mvvmlight/microsoft.toolkit.mvvm中, 聲明Command,如下:

    public class TestViewModel : ViewModelBase
    {
        public RelayCommand SendCommand { get; set; }

        public RelayCommand<string> SendMessageCommand { get; set; }
    }

Prism當中, 你可以使用DelegateCommand及帶參數的Command, 如下:

    public class TestViewModel : ViewModelBase
    {
        public DelegateCommand SendCommand { get; set; }

        public DelegateCommand<string> SendMessageCommand { get; set; }
    }

CompositeCommand

對於單個Command而言, 只是觸發單個對應的功能, 而復合命令是Prism當中非常強大的功能, CompositeCommand簡單來說是一個父命令, 它可以注冊N個子命令, 如下所示:

當父命令被激活, 它將觸發對所有的子命令, 如果任意一個命令CanExecute=false,它將無法被激活,如下所示:

如何定義復合命令,點擊觀看視頻

IEventAggregator

  • 松耦合基於事件通訊
  • 多個發布者和訂閱者
  • 微弱的事件
  • 過濾事件
  • 傳遞參數
  • 取消訂閱

該功能主要作用為, 事件聚合器負責接收訂閱以及發布消息。訂閱者可以接收到發布者發送的內容。
例如: AViewModel訂閱了一個消息接收的事件, 然后BViewModel當中給指定該事件推送消息,此時AViewModel接收BViewModel推送的內容。如下所示:

示例,下面演示如何創建訂閱及發布:

//創建事件
public class SavedEvent : PubSubEvent<string> { }

//發布
IEventAggregator.GetEvent<SavedEvent>().Publish("some value");

//訂閱
IEventAggregator.GetEvent<SavedEvent>().Subscribe(.Subscribe(message=>
            {
                //do something
            });

Filtering Events

在實際的開發過程當中,我們往往會在多個位置訂閱一個事件, 但是對於訂閱者而言, 他並不需要接收任何消息, 如下所示:

在Prism當中, 我們可以指定為事件指定過濾條件, 如下所示:

eventAggregator.GetEvent<MessageSentEvent>()
               .Subscribe(arg =>
               {
                   //do something
               },
               ThreadOption.PublisherThread,
               false,
               //設置條件為token等於“MessageListViewModel” 則接收消息
               message => message.token.Equals(nameof(MessageListViewModel)));

關於Subscribe當中的4個參數, 詳解:
1.action: 發布事件時執行的委托。
2.ThreadOption枚舉: 指定在哪個線程上接收委托回調。
3.keepSubscriberReferenceAlive: 如果為true,則Prism.Events.PubSubEvent保留對訂閱者的引用因此它不會收集垃圾。
4.filter: 進行篩選以評估訂閱者是否應接收事件。

Unsubscribe

為注冊的消息取消訂閱, Prism提供二種方式取消訂閱,如下:

1.通過委托的方式取消訂閱

var event = IEventAggregator.GetEvent<MessageSentEvent>();

event.Subscribe(OnMessageReceived);

event.Unsubscribe(OnMessageReceived);

2.通過獲取訂閱者token取消訂閱

var _event = eventAggregator.GetEvent<MessageSentEvent>();

var token = _event.Subscribe(OnMessageReceived);

_event.Unsubscribe(token);

下一章預告

本章主要講解:
1.Prism框架與其它框架的區別
2.Prism當中的Binding用法
3.Command和CompositeCommand 用法
4.IEventAggregator 以及Filtering Events 用法

下一章,我們將講解在Prism當中的區域導航功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM