Transcript MVVM

Realizacja aplikacji internetowych

MVVM, Prism i inni

MVC, MVP

MVVM

Anemiczny model ?

MVVM

Model services

MVVM czytanki

 http://www.codeproject.com/Articles/10017 5/Model-View-ViewModel-MVVM Explained

Tradycyjna aplikacja

Widok 1 Widok 1 Widok 2 Widok 2 Widok 2 Widok 2 Widok 2 Widok 2 Widok 2 Widok 2

MVVM

Model Widoku Model(e) i serwisy Model Widoku Model Widoku Model Widoku

Prism

 2.X

 4.0 – WPF 4.0, SL4.0

 4.1 – WPF 4.0, SL5.0

 4.5 – WPF 4.5, SL5.0

Podstawowe pojęcia:  Shell  Bootstapper  Moduł  Region  Widok

Prism – bootstrapper

 Inicjalizacja :  Aplikacji  Serwisów infrastukturalnych (core services)  Serwisów aplikacji

Prism – bootstrapper

UnityBootstrapper

/

MefBootstrapper

 Core services:  IModuleManager, IModuleCatalog, IModuleInitializer, IRegionManager, IEventAggregator, ILoggerFacade, IServiceLocator

Prism – shell

 Główne okno/strona  Anlogia do masterpage  Obejmuje regiony  Tworzony w Bootstrapperze (wstrzykiwany z Unity/MEF)

Prism – Region

“placeholder” dla dynamicznego kontentu Adaptery:

Prism – Wstrzykiwanie widoków

 Kod pobiera (np. z RegionManagera) referencję do regionu, tworzy i wstrzykuje widok IRegion region = regionManager.Regions["MainRegion"]; var ordersView = container.Resolve(); region.Add(ordersView, "OrdersView"); region.Activate(ordersView);

Prism – Odkrywanie widoków

 Definiujemy w RegionViewRegistry relacje Region vs. Typ Widkoku i podczas tworzenia regionu automatycznie tworzony jest odpowiedni widok this.regionManager.RegisterViewWithRegion("MainRegion “, () => this.container.Resolve());

Prism – Region adapter-y

ContentControlRegionAdapter

– dla kontrolek System.Windows.Controls.ContentControl i pochodnych

SelectorRegionAdapter

- dla pochodnych klas System.Windows.Controls.Primitives. (np. System.Windows.Controls.TabControl control).

ItemsControlRegionAdapter

– dla kobtrolek typu System.Windows.Controls.ItemsControl i pochodnych

TabControlRegionAdapter

– (tylko SL) Custom adapter np. dla stack pannel mappings.RegisterMapping(typeof(StackPannel), new StackPannelRegionAdapter());

Prism – custom adapter

} { protected override void Adapt(IRegion region, ContentControl regionTarget) region.Views.CollectionChanged += (sender, e) => { if (e.Action == NotifyCollectionChangedAction.Add) foreach(FrameworkElements element in e.NewItems) { regionTarget.Children.Add(element) ; } // handle removing of elemts };

Prism – Komunikacja

 Komendy  DelegateCommand – zwykle lokalna, używa delegatów, nie wymaga handlerów  DelegateCommand – bez paramerów  DelegateCommand - wymaga (XAML-> commandParameter =…) parametrów  CompositeCommand - zwykle globalna, służy do składania komend, składanie komend (dziala CanExecute -> wszystkie muszą być dostępne)  Shared Services  EventAggregator  Region Context

Prism – Komendy

  DelegateCommand – zwykle lokalna, używa delegatów, nie wymaga handlerów  DelegateCommand – bez paramerów  DelegateCommand - wymaga (XAML-> commandParameter =…) parametrów CompositeCommand - zwykle globalna, służy do składania komend, składanie komend (dziala CanExecute -> wszystkie muszą być dostępne)

Prism – EventAggregator

EA – subskrypcja

eventAggregator.GetEvent() .Subscribe(ShowNews);   wątki: 

PublisherThread

BackgroundThread

UIThread

.

eventAggregator.GetEvent().Subscri

be(ShowNews, ThreadOption.UIThread); Filtrowanie: fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, fundOrder => fundOrder.CustomerId == _customerId);

EA – publikacja, rezygnacja z s.

 Publikacja: EventAggregator.GetEvent() .Publish(“STOCK0”);  Rezygnacja z subskrypcji: FundAddedEvent

fundAddedEvent

= eventAggregator.GetEvent(); subscriptionToken = fundAddedEvent.Subscribe( FundAddedEventHandler, ThreadOption.UIThread, false);

fundAddedEvent.Unsubscribe(subscriptionToken);

Region Context

   Obiekt współdzielony przez hosta i widoki w regionie Widoczny w XML i w kodzie Wymaga dependancy object  To nie to samo co DataContext Definicja:

RegionManager.Regions["Region1"].Context = employeeId;

Odwołanie  Lub

ObservableObject viewRegionContext = RegionContext.GetObservableContext(this);

cal:RegionManager.RegionContext="{Binding Path=SelectedEmployee.EmployeeId}"

Prism linki

 HomePage http://compositewpf.codeplex.com/  HOL - http://msdn.microsoft.com/en us/library/gg405475%28v=pandp.40%29.a

spx  Dokumentacja http://msdn.microsoft.com/en us/library/gg406140.aspx

Inne MVVM

 Caliburn Micro  Knockout (JavaScript framework)  I inne … 