ViewModelLocatorBase
One of the more popular patterns for associating a view with it’s view model is the View Model Locator pattern. This is a special case of the Service Locator pattern, specifically tailored to XAML and MVVM. Update Controls supports this pattern with the ViewModelLocatorBase class.
The View Model Locator pattern is view-first. When a view appears, it uses the view model locator to find its view model. Since the default navigation structure of most XAML stacks is view-first as well, the view model locator pattern is a natural choice.
A XAML application creates an instance of a view model locator and adds it to its resource dictionary. Then, it creates the first view. The view uses the view model locator to find its view model and sets its data context. When it comes time to navigate to a new view, the child view goes through the same process.
ViewModelLocator
The ViewModelLocator class has a property for each view model. Since it creates the view models, it also needs references to the model so it can call the constructors. These references are likely to include a selection model – an object responsible for keeping track of which item the user has selected. This comes in handy when the user can select something from the main view model, and then navigate to the child view. The selected item is passed into the constructor of the child view model.
public class ViewModelLocator : ViewModelLocatorBase { private Document _document; private Selection _selection; public ViewModelLocator() { _document = LoadDocument(); _selection = new Selection(); } public object Main { get { return ViewModel(() => new MainViewModel(
_document, _selection)); } } public object Child { get { return ViewModel(() => _selection.SelectedItem == null ? null : new ChildViewModel(_selection.SelectedItem)); } } private Document LoadDocument() { // TODO: Load your document here. Document document = new Document(); return document; } }
The ViewModelLocatorBase class in Update Controls provides the ViewModel method. This method takes a lambda expression that creates the view model. Update Controls will cache the view model, and make sure that the constructor is called again if the parameters change. For example, when the user selects a different item, Update Controls will construct a new child view model.
App.xaml
The application adds an instance of the view model locator to the resource dictionary. It references the namespace, and gives the object a key. This lets views find the locator.
<Application x:Class="MyCoolApp.App" xmlns:vm="clr-namespace:MyCoolApp.ViewModels"> <!--Application Resources--> <Application.Resources> <vm:ViewModelLocator x:Key="Locator"/> </Application.Resources> </Application>
There will be other things in the resource dictionary, including perhaps merged dictionaries. Just put the view model locator right inside the Application.Resources element.
DataContext
Each view sets its data context by binding to a property of the view model locator. It sets the binding source to the view model locator as a static resource.
<phone:PhoneApplicationPage x:Class="MyCoolApp.MainPage" DataContext="{Binding Main, Source={StaticResource Locator}}"> </phone:PhoneApplicationPage>
With this pattern, the view model locator is a singleton. Each view accesses a property of that single object to get its view model. The base class provided by Update Controls makes sure that a new view model is created if any of its constructor parameters change. This lets you set state in one view, and then depend upon that state as you navigate to another view. It’s a natural and straight-forward way of structuring your XAML applications.
Recent comments
3 years 13 weeks ago
3 years 19 weeks ago
3 years 44 weeks ago
3 years 46 weeks ago
3 years 47 weeks ago
4 years 3 days ago
4 years 3 days ago
4 years 17 weeks ago
4 years 17 weeks ago
4 years 21 weeks ago