在mvvm模型中实施Windows Phone应用

克里希纳

我正在尝试为我正在开发的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.
      };
   });
}

创建一个新的EmpDetailsModels将其分配给前this.Model将触发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框架,但我引用它是因为它被广泛使用,它拥有一个庞大的社区,并且致力于使事情变得尽可能简单。

我知道这个答案只是实现您想要的起点。我只给您一些需要进一步研究的想法,但我希望它能帮助您朝正确的方向前进。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windows Phone应用中的图像加载时间

来自分类Dev

Windows Phone应用缺少EventToCommand

来自分类Dev

Windows Phone应用程序中的CEF

来自分类Dev

如何创建Windows Phone 8应用包?

来自分类Dev

通用应用Windows Phone定位

来自分类Dev

sqlite Windows Phone 8应用示例

来自分类Dev

Windows Phone 8.1 Silverlight应用程序

来自分类Dev

如何关闭Windows Phone 8.1应用

来自分类Dev

如何终止Windows Phone 8.1应用

来自分类Dev

恢复应用Windows Phone

来自分类Dev

Singleton Windows Phone本机应用程序

来自分类Dev

Windows Phone应用中的倒数日期

来自分类Dev

Windows 10上的Windows Phone应用

来自分类Dev

使用OAuth2的Windows Phone应用

来自分类Dev

在Windows Phone应用中显示html

来自分类Dev

Windows Phone的TestAccelerometer实施

来自分类Dev

使用新项目更新Windows Phone应用

来自分类Dev

以编程方式关闭Windows Phone应用

来自分类Dev

在Windows Phone中运行应用

来自分类Dev

画布线在Windows Phone应用中被裁剪

来自分类Dev

在Windows Phone 8中共享应用

来自分类Dev

在mvvm模型中实施Windows Phone应用

来自分类Dev

在Windows Phone 8和MVVM中向应用程序栏动态添加按钮

来自分类Dev

在Windows Phone应用中查找错误点

来自分类Dev

Windows Phone 8应用提交

来自分类Dev

Windows Phone应用中的OutOfMemoryException

来自分类Dev

恢复应用Windows Phone

来自分类Dev

Windows Phone的TestAccelerometer实施

来自分类Dev

在Windows Phone 8.1上运行Windows Phone 8应用