相信.NET程序員多多少少都聽說過MVVM的設計模式,對於一個大一點的項目來說,使用這種設計模式無疑是一種不錯的選擇, 它提高了程序的可維護性,降低了耦合度,可以實現代碼的重用,方便獨立開發和進行測試。這里,筆者講述一下如何在WindowsPhone中開發使用這種設計模式。
功能描述:通過在前台顯示和更改數據來保證后台數據可以實時更新,始終與前台保持一致。
首先,我們建立一個空的WindowsPhone工程,分別為當前工程中添加一個ViewModel文件夾和Model文件夾,用於儲存不同的類文件,這樣方便進行管理和編寫,如圖一所示:
圖一
其次,我們需要在Model文件夾中創建一個Person類,用於在后台存儲數據,示例代碼如下所示:
1 namespace MVVMDemo.Model 2 { 3 /// <summary> 4 /// 該類繼承INotifyPropertyChanged,用於對屬性值放生改變時的通知 5 /// 需要自定義實現一個對應的通知函數:FirePropertyChanged 6 /// </summary> 7 public class Person:INotifyPropertyChanged 8 { 9 private string _name; 10 11 public string Name 12 { 13 get { return _name; } 14 set { 15 if (value != _name) 16 { 17 _name = value; 18 FirePropertyChanged(); 19 } 20 } 21 } 22 23 private int _age; 24 25 public int Age 26 { 27 get { return _age; } 28 set { 29 if (value != _age) 30 { 31 _age = value; 32 FirePropertyChanged(); 33 } 34 } 35 } 36 37 public Person(string name, int age) 38 { 39 this.Name = name; 40 this.Age = age; 41 } 42 43 public event PropertyChangedEventHandler PropertyChanged; 44 45 public void FirePropertyChanged([CallerMemberName]string propertyName=null) 46 { 47 if (PropertyChanged != null) 48 { 49 PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 50 } 51 } 52 } 53 }
再其次,我們需要在ViewModel中實現一個用於獲取Model中數據的類,示例代碼如下所示:
1 namespace MVVMDemo.ViewModel 2 { 3 public class GetInfo 4 { 5 public Person person ; 6 7 public GetInfo(string name="Demo", int age=0) 8 { 9 person = new Person(name, age); 10 } 11 12 public Person GetPerson() 13 { 14 return person; 15 } 16 17 public void SetPerson(string name, int age) 18 { 19 person.Name = name; 20 person.Age = age; 21 } 22 } 23 }
最后,我們需要在View中進行相關數據的展示,筆者這里使用到了數據綁定,如果您對這一部分不是很了解的話,可以查看博客園中一些大牛的博文進行了解,我這里就直接使用了,XAML和CS對應的示例代碼如下所示:
1 <StackPanel> 2 <GridView Header="設置值:" FontSize="20"> 3 <StackPanel> 4 <StackPanel Orientation="Horizontal"> 5 <TextBlock Text="Name:" VerticalAlignment="Center"/> 6 <TextBox x:Name="tb_Name" Text="{Binding Name}" Width="200"/> 7 </StackPanel> 8 <StackPanel Orientation="Horizontal"> 9 <TextBlock Text="Age" VerticalAlignment="Center"/> 10 <TextBox x:Name="tb_Age" Text="{Binding Age}" Width="200" Margin="12"/> 11 </StackPanel> 12 <Button Content="修改當前值" Click="ButtonBase_OnClick"/> 13 14 <StackPanel Orientation="Horizontal"> 15 <TextBlock Text="Name:" VerticalAlignment="Center" FontSize="20"/> 16 <TextBlock Text="{Binding Name}" Width="200" FontSize="20"/> 17 </StackPanel> 18 <StackPanel Orientation="Horizontal" > 19 <TextBlock Text="Age" VerticalAlignment="Center" FontSize="20"/> 20 <TextBlock Text="{Binding Age}" Width="200" Margin="12" FontSize="20"/> 21 </StackPanel> 22 </StackPanel> 23 </GridView> 24 </StackPanel>
1 namespace MVVMDemo 2 { 3 /// <summary> 4 /// 可用於自身或導航至 Frame 內部的空白頁。 5 /// </summary> 6 public sealed partial class MainPage : Page 7 { 8 private GetInfo info; 9 10 public MainPage() 11 { 12 this.InitializeComponent(); 13 14 this.NavigationCacheMode = NavigationCacheMode.Required; 15 } 16 17 /// <summary> 18 /// 在此頁將要在 Frame 中顯示時進行調用。 19 /// </summary> 20 /// <param name="e">描述如何訪問此頁的事件數據。 21 /// 此參數通常用於配置頁。</param> 22 protected override void OnNavigatedTo(NavigationEventArgs e) 23 { 24 // TODO: 准備此處顯示的頁面。 25 26 if (e.NavigationMode == NavigationMode.New) 27 { 28 info = new GetInfo(); 29 this.DataContext = info.GetPerson(); 30 } 31 32 // TODO: 如果您的應用程序包含多個頁面,請確保 33 // 通過注冊以下事件來處理硬件“后退”按鈕: 34 // Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。 35 // 如果使用由某些模板提供的 NavigationHelper, 36 // 則系統會為您處理該事件。 37 } 38 39 private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 40 { 41 info.SetPerson(tb_Name.Text, Convert.ToInt32(tb_Age.Text)); 42 this.DataContext = info.GetPerson(); 43 } 44 } 45 }
最后,程序運行的效果如圖二圖三所示(它們操作的都是同一個對象):
圖二:原始數據 圖三:修改后的數據
可能你認為MVVM在使用中有點麻煩,但請用發展的眼看來看待它,如果你期待你的項目能夠長期進行運作和擴展,那筆者還是很建議你使用這種開發方式的,因為隨着你項目的逐漸擴大,你會發現管理起來確實很方便的。順便附帶一個Demo,給初學者一個參考!
如果你感覺這篇博文對你有用,請記得點贊哦!!!!!!!!!!!