上一篇咱們簡單對MvvmLight作了介紹。羅列了三個DLL中,各個命名空間下主要類的定義及大體做用。由於只是範範的概論,對於從未接觸過MvvmLight的萌新來講,根本就是在晃點他們。不過萬事開頭難麼,本篇則會以Hello World般的簡單例子,來給萌新們當頭一擊,教會他們使用MvvmLight最最基礎的部分。html
首先仍是動手練習,打開免費又強大的Visual Studio 2015 Community,建立一個WPF Application。不建立Win10的Universal App是由於MvvmLight V5.2還不能給Universal App自動添加ViewModel等代碼(咱們下次本身加)。不使用8.1 Runtime App是由於我沒在本身電腦上裝8.1的SDK ^o^。express
新建的WPF Application是一個簡單至極的空項目,僅有App.xaml和MainWindow.xaml兩個文件。XAML文件空空如也。框架
而後咱們經過NuGet添加MvvmLight的類庫,完成以後多出ViewModel文件夾,包含如下兩個文件:ide
MainViewModel.csspa
ViewModelLocator.cscode
另外App.xaml裏將ViewModelLocator做爲資源添加全局的Application.Resources裏:orm
<Application.Resources> <ResourceDictionary> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:HelloMvvmLight.ViewModel" /> </ResourceDictionary> </Application.Resources>
很是遺憾沒有像Windows Phone工程那樣貼心的在MainWindow裏添加對MainViewModel的DataContext綁定,心情很糟糕的咱們只有本身來了,順便給MainViewModel里加上HelloWord的字樣唄,完成後運行以下圖:xml
下面咱們來大體講解MvvmLight在程序中起到的做用。htm
MainWindow對應的ViewModel是MainViewModel,一般咱們是在MainWindow的XAML或cs文件裏new一個ViewModel的實例,賦值給DataContext。但在MvvmLight中,建立實例的工做,交給了ViewModelLocator這個類。blog
在類ViewModelLocator裏,咱們註冊了MainViewModel,並經過屬性Main來獲取實例。
public class ViewModelLocator { /// <summary> /// Initializes a new instance of the ViewModelLocator class. /// </summary> public ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); SimpleIoc.Default.Register<MainViewModel>(); } public MainViewModel Main { get { return ServiceLocator.Current.GetInstance<MainViewModel>(); } } public static void Cleanup() { // TODO Clear the ViewModels } }
以前提到安裝MvvmLight庫時App.xaml添加了ViewModelLocator實例的資源,在XAML中以StaticResource key的形式獲取,Binding到MainWindow的DataContext。
<Window.DataContext> <Binding Path="Main" Source="{StaticResource Locator}"></Binding> </Window.DataContext>
使用ViewModelLocator有啥好處呢?
首先View和ViewModel之間再也不直接引用,而是經過ViewModelLocator關聯。
其次儲存在ViewModelLocator裏的ViewModel相似於單例的存在,能夠在全局引用綁定。
同時避免了某些狀況下頻繁建立ViewModel,卻未作好資源釋放形成的內存泄漏。(這裏並非說全部的ViewModel都必須放到ViewModelLocator)
下面咱們來看下Command是如何綁定的,通知PropertyChanged以及ViewModelBase類 。
咱們添加一個Button,而後經過Command來把文字修改成Hello MvvmLight。
ViewModel的代碼:
public class MainViewModel : ViewModelBase { private string title; public string Title { get { return title; } set { Set(ref title , value); } } public ICommand ChangeTitleCommand { get; set; } /// <summary> /// Initializes a new instance of the MainViewModel class. /// </summary> public MainViewModel() { Title = "Hello World"; ChangeTitleCommand = new RelayCommand(ChangeTitle); } private void ChangeTitle() { Title = "Hello MvvmLight"; } }
MainWindow的XAML:
<Window x:Class="HelloMvvmLight.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:HelloMvvmLight" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <Binding Path="Main" Source="{StaticResource Locator}"></Binding> </Window.DataContext> <Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock Text="{Binding Title}"></TextBlock> <Button Grid.Row="1" Command="{Binding ChangeTitleCommand}"></Button> </Grid> </Window>
MvvmLight很貼心的爲咱們實現了RelayCommand類,該類繼承自ICommand接口。直接在XAML裏綁定就能夠了。固然若是是沒有提供Command屬性的控件,就須要用到Blend來添加behavior了(能夠期待後續篇章介紹)。
MvvmLight的ViewModelBase頗有意思,繼承了INotifyPropertyChanged接口,並提供了一個Set方法來給屬性賦值,簡單理解就是不用本身在ViewModel實現INotifyPropertyChanged,而後在屬性賦值時通知了。固然MvvmLight也提供了手動通知的方法:
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null); protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression);
至此一個最簡單的使用MvvmLight框架的程序已經完成了。由於是入門寫的比較簡單,請各位大牛輕踩。