欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WPF框架Prism中使用MVVM架構(gòu)

 更新時(shí)間:2022年02月11日 10:31:34   作者:痕跡g  
這篇文章介紹了WPF框架Prism中使用MVVM架構(gòu)的方式,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

常見的MVVM框架

眾所周知, 如果你了解WPF當(dāng)中的ICommand, INotifyPropertyChanged的作用, 就會(huì)發(fā)現(xiàn)眾多框架都是基于這些進(jìn)行擴(kuò)展, 實(shí)現(xiàn)其通知、綁定、命令等功能。

對(duì)于不同的MVVM框架而言, 大體使用上會(huì)在聲明方式上的差異, 以及特定功能上的差別。

下面列舉了常用的3個(gè)MVVM框架,他們的一些差異。如下所示:

功能↓ / →框架名PrismMvvmlightMicorosoft.Toolkit.Mvvm
通知BindableBaseViewModelBaseObservableObject
命令DelegateCommandRelayCommandAsync/RelayCommand
聚合器IEventAggregatorIMessengerIMessenger
模塊化××
容器××
依賴注入××
導(dǎo)航××
對(duì)話××

正如你所見, 各個(gè)框架之間都有各自的通知、綁定、事件聚合器等基礎(chǔ)的功能, 而Prsim自帶的依賴注入、容器、以及導(dǎo)航會(huì)話等功能, 可以為你提供更加強(qiáng)大的功能。

當(dāng)然,在實(shí)際的開發(fā)過程當(dāng)中, 可以根據(jù)實(shí)際的功能需求, 對(duì)不同的框架選型, 同時(shí)這也需要你對(duì)各個(gè)框架之間的優(yōu)缺點(diǎn)進(jìn)行判斷。

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

BindableBase

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

    public class TestViewModel : ViewModelBase
    {
        private string _message;

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

在Prism當(dāng)中, 你需要繼承于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當(dāng)中, 你可以使用DelegateCommand及帶參數(shù)的Command, 如下:

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

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

CompositeCommand

對(duì)于單個(gè)Command而言, 只是觸發(fā)單個(gè)對(duì)應(yīng)的功能, 而復(fù)合命令是Prism當(dāng)中非常強(qiáng)大的功能, CompositeCommand簡單來說是一個(gè)父命令, 它可以注冊N個(gè)子命令, 如下所示:

當(dāng)父命令被激活, 它將觸發(fā)對(duì)所有的子命令, 如果任意一個(gè)命令CanExecute=false,它將無法被激活,如下所示:

IEventAggregator

  • 松耦合基于事件通訊
  • 多個(gè)發(fā)布者和訂閱者
  • 微弱的事件
  • 過濾事件
  • 傳遞參數(shù)
  • 取消訂閱

該功能主要作用為, 事件聚合器負(fù)責(zé)接收訂閱以及發(fā)布消息。訂閱者可以接收到發(fā)布者發(fā)送的內(nèi)容。

例如: AViewModel訂閱了一個(gè)消息接收的事件, 然后BViewModel當(dāng)中給指定該事件推送消息,此時(shí)AViewModel接收BViewModel推送的內(nèi)容。如下所示:

示例,下面演示如何創(chuàng)建訂閱及發(fā)布:

//創(chuàng)建事件
public class SavedEvent : PubSubEvent<string> { }

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

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

Filtering Events

在實(shí)際的開發(fā)過程當(dāng)中,我們往往會(huì)在多個(gè)位置訂閱一個(gè)事件, 但是對(duì)于訂閱者而言, 他并不需要接收任何消息, 如下所示:

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

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

關(guān)于Subscribe當(dāng)中的4個(gè)參數(shù), 詳解:

  • 1.action: 發(fā)布事件時(shí)執(zhí)行的委托。
  • 2.ThreadOption枚舉: 指定在哪個(gè)線程上接收委托回調(diào)。
  • 3.keepSubscriberReferenceAlive: 如果為true,則Prism.Events.PubSubEvent保留對(duì)訂閱者的引用因此它不會(huì)收集垃圾。
  • 4.filter: 進(jìn)行篩選以評(píng)估訂閱者是否應(yīng)接收事件。

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);

到此這篇關(guān)于WPF框架Prism中使用MVVM架構(gòu)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論