Realizacja aplikacji internetowych MVVM, Prism i inni
MVC, MVP
MVVM Anemiczny model ?
MVVM Model services
MVVM czytanki http://www.codeproject.com/Articles/100175/Model-View-ViewModel-MVVM-Explained
Tradycyjna aplikacja Widok 1 Widok 2 Widok 1 Widok 2 Widok 2 Widok 2
MVVM Widok 1 Widok 1 Model(e) i serwisy Widok 2 Widok 2 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 – architektura aplik.
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<OrdersView>(); 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<EmployeeView>());
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 Shared Services EventAggregator DelegateCommand – zwykle lokalna, używa delegatów, nie wymaga handlerów DelegateCommand – bez paramerów DelegateCommand<T> - wymaga parametrów (XAML-> commandParameter=…) 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<T> - wymaga parametrów (XAML-> commandParameter=…) 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<TickerSymbolSelectedEvent>().Subscribe(ShowNews); wątki: PublisherThread BackgroundThread UIThread. eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Subscribe(ShowNews, ThreadOption.UIThread); Filtrowanie: fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, fundOrder => fundOrder.CustomerId == _customerId);
EA – publikacja, rezygnacja z s. EventAggregator.GetEvent<TickerSymbolSelectedEvent>().Publish(“STOCK0”); Rezygnacja z subskrypcji: FundAddedEvent fundAddedEvent = eventAggregator.GetEvent<FundAddedEvent>(); 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 ObservableObject<object> viewRegionContext = RegionContext.GetObservableContext(this); Lub 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.aspx Dokumentacja http://msdn.microsoft.com/en-us/library/gg406140.aspx
Inne MVVM Caliburn Micro Knockout (JavaScript framework) I inne…