一、View
View視圖層
就是xaml檔案 主要就是介面的設計 xaml.cs檔案只有預設產生的程式碼,MVVM模式一般不用將頁面的資料初始化,事件處理的代碼寫在xaml.cs上
資料初始化可以通過資料繫結來實現 事件的處理也是通過綁定Command來實現
先添加資源 這裡是放在App.xaml上載入
<!--這裡是將你寫好的ViewModel放到了程式資源裡面去,接下來的綁定將會用到的-->
<Application.Resources>
<vm:GlobalViewModelLocator xmlns:vm="clr-namespace:MyProject.ViewModels"
x:Key="Locator" />
</Application.Resources>
MyProject.ViewModels是命名空間 GlobalViewModelLocator則是你寫好的ViewModel類 資源的key用Locator來表示
當然 你也可以通過在具體的頁面來實現上載入ViewModel作為資源
在xaml頁面上就可以綁定ViewModel了
如
<phone:PhoneApplicationPage
……
DataContext="{Binding MainViewModel, Source={StaticResource Locator}}"
……
">
這樣就綁定了 之前定義的ViewModel資源啦
然後呢 你就可以在頁面的控制項上綁定到ViewModel的定義好的資料和Command命令了(有些項目會將Command與ViewModel完完全全分開工作,個人覺得Command放在ViewModel進行初
始化和調用會更加好一些,也就是說所有的綁定無論是資料或者是Command命令都是放在ViewModel)
如
<TextBlock Grid.Row="1"
Text="{Binding Item.AverageRating}"
Margin="0,0,8,0"
FontSize="24"
VerticalAlignment="Center" />
這是綁定了ViewModel的資料
<i:Interaction.Triggers>
<li:TapTrigger>
<cmd:EventToCommand Command="{Binding TapCommand}" PassEventArgsToCommand="True"/>
</li:TapTrigger>
</i:Interaction.Triggers>
這是綁定了ViewModel的Command命令 這個是使用了MVVM Light toolkit架構的寫法
二、ViewModel
ViewModel是視圖模型層 這一層是負責了對View視圖層展現以及各種事件的處理 灰常灰常重要
實現ViewModel層的方法很多
可以通過繼承INotifyPropertyChanged 介面實現 繼承ViewModelBase基類來實現 繼承IEnumerable<T>介面來實現 使用第三方架構的基類實現等等
繼承INotifyPropertyChanged 介面實現文法如下
public class PersonViewModel : INotifyPropertyChanged
{
private string firstNameValue;
public string FirstName{
get { return firstNameValue; }
set
{
firstNameValue=value;
// 通知FirstName屬性的改變
NotifyPropertyChanged("FirstName");
}
}
// 定義PropertyChanged 事件
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
其實ViewModel類的原理都是大同小異的 簡單地說就是它的屬效能夠動態地變化,因為要跟View層互動
Command命令一般都需要定義成獨立的類來實現,然後再ViewModel上執行個體化
Command命令類的實現的方法也幾種方法
比如繼承ICommand 使用第三方組件的Command命令的類
繼承ICommand 的文法如下
public class MyCommand<T> : ICommand
{
Action<T> Excuted;
Func<bool> canExcute;
public ShowMessageCommand(Action<T> excuted)
{
this.Excuted = excuted;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
//你的需要執行的代碼
}
}
View層要傳遞的參數等等都可以通過資料繫結來擷取然後再在Command命令中處理,最後再通過資料繫結展現在View視圖層上
三、Model
Model層比較簡單就是一個物件導向的實體類
比如
public class Person
{
public int age { get; set; }
public string name { get; set; }
}
public class Persons
{
public List<Person> person;
public List<Person> getPerson()
{
person = new List<Person>()
{
new Person{name = "Tom", age = 21 },
new Person{name = "Jack", age = 22 },
new Person{name = "Rose", age = 23 },
};
return person;
}
}
Model層是主要的作用就是將資訊用物件導向的方法封裝起來,然後給ViewModel層使用