c# - 在mvvm模型中实现Windows Phone应用

标签 c# windows-phone-7 mvvm windows-phone-8 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,后者通过绑定(bind)机制(由Silverlight框架在WP上提供)绑定(bind)到View。
这意味着ViewModel包含View所需的所有数据,实际上 ViewModel表示View 的所有数据或行为。

由于不是描述整个MVVM模式及其所有功能的最佳人选,因此我会将这项敏感任务留给该领域的大多数知识渊博的人;)。这里有一些非常有用的链接应该可以帮助您:

  • From Josh Smith
  • Wikipedia与ViewModel的代码示例
  • 如果您已经了解MVC或MVP模式,则此one将帮助您发现差异

  • 所有这些告诉您,您一定对理论有些无聊,所以让我们尝试编写一些代码。问题在于组织代码的方式有很多,因此,后面的只是一种伪代码,不能直接在您的应用程序中使用!

    在您的情况下,您可以只创建一个像这样的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。Model将触发RaisePropertyChanged并通知View此属性已更改。更具体地说,将通知绑定(bind)到此属性的UI组件进行更新。
    要将UI组件绑定(bind)到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 *事件处理程序中调用“最新条目”按钮,将其绑定(bind)到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中创建命令并绑定(bind)到“最新”
    条目”按钮,而不是直接在
  • 后面的代码中调用GetLastestEntries方法

    所有这些的缺点是您将不得不编写更多的代码,这就是MVVM framweworks出现的地方!这些框架将帮助您以最少的精力编写干净的MVVM应用程序。

    作为初学者,我会热忱建议您访问MVVM Light Toolkit网站。它包含许多有关MVVM模式的有用文章,以了解如何设计MVVM应用程序以及如何使用此框架处理常见场景。 MVVM Light并不是Windows Phone上运行的唯一MVVM框架,但我引用它是因为它被广泛使用,它拥有一个庞大的社区,并且致力于使事情变得尽可能简单。

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

    关于c# - 在mvvm模型中实现Windows Phone应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343324/

    相关文章:

    .net - 为要连接的 Windows Phone 7 应用程序构建服务的最佳可扩展架构是什么?

    wpf - WPF MVVM 中的两个 'self-updating' 属性

    c# - 动态添加超链接到gridview

    windows-phone-7 - 是否可以在 Windows Phone 7 中使用 Microsoft 推送通知发送图像、视频、声音等?

    c# - 每个实现都需要不同参数的模板方法模式?

    windows-mobile - 企业 Windows Mobile 应用程序现在的去向

    android - 使用来自父级的属性以编程方式添加 Mx Spinner

    c# - FlexLayout 可绑定(bind)源 -xamarin 表单 - 如何在不绑定(bind)的情况下获取数据

    c# - 寻找解释设计模式的高质量视频

    C# 多态性 - 如何不对类型进行硬编码