簡體   English   中英

在mvvm模型中實施Windows Phone應用

[英]Implement the windows phone app in mvvm model

我正在嘗試為我正在開發的Windows Phone應用程序之一實現MVVM,並且該應用程序越來越大。 我已經在Model類中嘗試了下面的代碼。我想知道如何處理用戶單擊“最新條目”按鈕,它將連接到服務並異步執行方法的情況。一旦返回數據,我必須在UI中顯示最新記錄,該記錄具有3個文本字段EmpName,EmpID,Address。

模型類中的代碼:

      public class EmpDetailsModel:INotifyPropertyChanged
        {

            private string _EmpName;
            public string EmpName
            {
                get { return _EmpName; }
                set {
                    if (value != _EmpName)
                    {

                        _EmpName = value;

                        RaisePropertyChanged("EmpName");
                    }
                }
            }

            private string _EmpId;
            public string EmpId
            {
                get { return _EmpId; }
                set {
                    if (value != _EmpId)
                    {
                        _EmpId = value;

                        RaisePropertyChanged("EmpId");
                    }
                }
            }

            private string _Address;

            public string Address
            {
                get { return _Address; }
                set {
                    if (value != _EmpId)
                    {

                        _EmpId = value;

                        RaisePropertyChanged("Address");
                    }
                }
            }

            #region myfirstmodel inotify members
            public event PropertyChangedEventHandler PropertyChanged;

            private void RaisePropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            #endregion

連接到服務的代碼如下:

    EmpAzureSer empAzureSer = new EmpAzureSer();
    empAzueSer.GetLatestEntry += new GetLatestEntryCompletedEventHandler(LatestEntryCompleted);
    private void LatestEntryCompleted(object sender, GetLatestEntryCompletedEventArgs e
            {
              //get the data from e as e.Name,e.Id and e.Address and bind them to UI.
            }

查看xaml代碼:

                        <Button Name="FetachLAtest" Click="FetachLatest_Click"></Button>
                        <TextBlock Name="EmployeeName"></TextBlock>
                        <TextBlock Name="EmployeeID"></TextBlock>
                        <TextBlock Name="EmployeeAddress"></TextBlock>

我正在跟蹤鏈接http://msdn.microsoft.com/en-us/library/windowsphone/develop/gg521153(v=vs.105).aspx

這很有幫助,但我想知道將代碼連接到哪里(服務?模型或Viewmodel?),viewmodel應該是什么樣子?

有多種方法可將MVVM實施到應用程序中,具體取決於開發人員和應用程序要求。

但是首先,讓我們嘗試使事情簡單並專注於ViewModels(因為這似乎是您的興趣所在)。

MVVM表示模型View ViewModel,Model是您的業務/域代碼,View本質上是您的XAML及其相關代碼,而ViewModel是View和Models之間的鏈接/膠水。 需要注意的重要一點是ViewModels一定不知道View(即不引用它們)。 這樣可以確保更好地分離關注點,從而嘗試構建易於測試和維護的應用程序。

簡而言之,ViewModels不了解View,但是它們必須與它們進行通信……而Bindings使這種魔術成為可能! XAML / UI組件顯示數據,這些數據來自ViewModel,后者通過綁定機制(由Silverlight框架在WP上提供)綁定到View。 這意味着ViewModel包含View所需的所有數據,實際上ViewModel代表 View的所有數據或行為

由於不是描述整個MVVM模式及其所有功能的最佳人選,因此我將把這一敏感任務留給該領域的大多數知識淵博的人;)。 這里有一些非常有用的鏈接應該可以幫助您:

所有這些被告知,您一定對理論有些無聊,所以讓我們嘗試編寫一些代碼。 問題在於組織代碼的方式有很多,因此,后面的只是一種偽代碼,不能直接在您的應用程序中使用!

在您的情況下,您可以只創建一個像這樣的ViewModel

public class WhateverYouWantViewModel : INotifyPropertyChanged
{
    private EmpDetailsModel _model;
    public EmpDetailsModel Model
    {
        get { return _model; }
        set
        {
            if (value != _model)
            {
                _model = value;
                RaisePropertyChanged("Model");
            }
        }
    }

    public void GetLastestEntries()
    {
        // put in here the code calling your service
    }
}

關於從數據服務到this.Model的分配,我們正在處理異步回調,因此,如果未從UI線程調用回調,則使用Dispatcher可能更明智:

EmpAzureSer empAzureSer = new EmpAzureSer();
empAzueSer.GetLatestEntry += new GetLatestEntryCompletedEventHandler(LatestEntryCompleted);
private void LatestEntryCompleted(object sender, GetLatestEntryCompletedEventArgs e
{
   Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
      this.Model = new EmpDetailsModel()
      {
        //get the data from e as e.Name,e.Id and e.Address and bind them to UI.
      };
   });
}

它分配給this.Model之前創建一個新的EmpDetailsModels將觸發RaisePropertyChanged並通知查看該屬性已經改變。 更具體地說,將通知綁定到此屬性的UI組件進行更新。 要將UI組件綁定到ViewModel,可以執行以下操作:

  <Button Name="FetachLAtest" Click="FetachLatest_Click"></Button>
  <TextBlock Name="EmployeeName" Text="{Binding Model.EmpName}"></TextBlock>
  <TextBlock Name="EmployeeID" Text="{Binding Model.EmpId}"></TextBlock>
  <TextBlock Name="EmployeeAddress" Text="{Binding Model.Address}"></TextBlock>

不要忘記使用ViewModel實例設置View的DataContext。 最后但並非最不重要的一點是,您必須通過從* View.FetachLatest_Click *事件處理程序中調用“最新條目”按鈕,將其綁定到ViewModel.GetLastestEntries方法。 所有這些都可以通過以下方式實現:

public partial class YourView : BasePage
{
    private WhateverYouWantViewModel _viewModel;

    public YourView()
    {
        InitializeComponent();
        _viewModel =  new WhateverYouWantViewModel();
        this.DataContext = _viewModel;
    }

    private void FetachLatest_Click(object sender, RoutedEventArgs e)
    {
        _viewModel.GetLastestEntries();
    }
}

就是(差不多)了! 為什么差不多? 因為View和ViewModel之間的鏈接非常牢固,並且在后面的代碼中定義了(這是我們通常在MVVM中要避免的事情)。 幸運的是,有一些解決方案可以解決此問題:

  • 我們所謂的ViewModelLocator可以用來存儲和定位ViewModels
  • 可以在WhateverYouWantViewModel中創建一個命令並綁定到“最新條目”按鈕,而不是直接在后面的代碼中調用GetLastestEntries方法

所有這些的缺點是您將不得不編寫更多的代碼,這就是MVVM framweworks出現的地方! 這些框架將幫助您以最小的努力編寫干凈的MVVM應用程序。

作為初學者,我會熱烈建議您訪問MVVM Light Toolkit網站。 它包含許多有關MVVM模式的有用文章,以學習如何設計MVVM應用程序以及如何使用此框架處理常見場景。 MVVM Light並不是Windows Phone上運行的唯一MVVM框架,但我引用它是因為它被廣泛使用,它擁有一個龐大的社區,並且致力於使事情變得盡可能簡單。

我知道這個答案只是實現您想要的起點。 我只給您一些需要進一步研究的想法,但我希望它能幫助您朝正確的方向發展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM