在WindowsPhone開發中使用MVVM設計模式


相信.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,給初學者一個參考!

如果你感覺這篇博文對你有用,請記得點贊哦!!!!!!!!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM