uwp开发:MVVM模式和数据绑定结合使用实战示例

——我的《简影uwp》开发了一段时间了,现在各个板块和基本功能已经完工,剩下的就是细节方面的处理和UI排版设计了。开发期间遇到过很多问题,由于是个人独立开发。所以好多问题需要自己想好长时间,或者去网上寻找大神求助,有时候晚上做梦都是满脑子的代码。好的是大部分最终都解决了!真的非常感谢那些帮助我的大神们,和他们交流,我学到了很多。。。

好了,闲话不多说,前几天,我处理的是集合数据绑定的问题,也就是说返回的是一个集合数据,用MVVM模式来说,让ViewModel层实现ObservableCollection接口,并且在ViewModel里将获取到的list数据集合采取遍历集合并添加进ObservableCollection集合里,这样,在View层的后台,只需实例化ViewModel,并绑定到界面上,这样就实现了集合绑定及更改通知。

今天要说的是MVVM模式中处理非集合数据对象的绑定,这样的话,当然是要让ViewModel 实现INotifyPropertyChanged接口了。
1、Model类如下:

 public  class TCContent
    {
        public string Image { get; set; }
        public string Title { get; set; }
        public string Directors { get; set; }
        public string Casts { get; set; }
        public string Pubdate { get; set; }
        public string TrailerUrl { get; set; }
        public string ItemSummary { get; set; }

    }

2、在ViewModel中,该怎么写呢?

因为INotifyPropertyChanged接口,它通知的对象是属性。所以,怎样才能通知到Modle中的每个属性呢?总不能把Model类的所有属性都写一遍再通知吧?当然不是了,其实很简单,就是将Model作为ViewModel的一个属性。
为了代码简洁,重用方便,定义个ViewModelBase的类,让它来实现INotifyPropertyChanged接口,完成相关通知。最后让ViewModel继承它就可以了。
这个BaseModel类如下:注意,我这里写出了实现属性更改通知的两种方法,早期一般用的是第二种,也很容易理解,在ViewModel的属性的set方法里,调用该方法即可,括号内传入的是属性名。这种方法容易看懂,但是缺点也很明显,就是属性名容易写错。
而第一种方法是推荐使用的,这里用到了CallerMeberName这个特性,具体可以查msdn文档,就是说系统内部通过反射可以自动获取属性名,这样的话,我们在ViewModel类的属性的set方法里就不用再写属性名了,很方便。我这里用方法一示例。

ViewModleBase类:

public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        //方法一:CallerMemberName 特性可以获取到 成员
        public void MyPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        ////方法2:
        //public void OnPropertyChanged(string propertyName)
        //{
        //    PropertyChangedEventHandler handler = this.PropertyChanged;
        //    if (handler != null)
        //    {
        //        handler.Invoke(this, new PropertyChangedEventArgs(propertyName));
        //    }
        //}
    }

3、下来是
ViewModel类如下:这里把Model类作为一个属性,同时继承自刚才实现的ViewModel基类。这样,只需要在ViewModel里实现MyPropertyChanged方法即可。而且因为在ViewModelBase中用的是第一种方法,可以直接获取到属性名,所以只需写出该方法即可!

public class TCContentViewModel :ViewModelBase
    {
        private TCContent _tcContent;
        public TCContent TcContent
        {
            get { return _tcContent; }
            set
            {
                _tcContent = value;
                MyPropertyChanged();
            }
        }
    }

4、下来,就是View层了,在view层界面需要的是展示Modle里的属性。

在View后台: 在外部声明 ViewModel的对象 tvm,然后在构造函数里实例化即可。

        private TCContentViewModel tvm;
        public TCContentView()
        {
            this.InitializeComponent();
            tvm = new TCContentViewModel();

        }
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            if (e.Parameter != null)
            {
                tvm.TcContent = await NetService.TCNetservice.GetTCContent((e.Parameter as TC).Tid);
            }
        }

5、最后一步:
在View前台界面:截取部分如下:

每个要显示的元素绑定到ViewModel实例化的对象 tvm 上的TcContent属性的属性上,因为TcContent这个属性才是我们要显示的元素对应的Model,而我们需要的就是Model里面的属性,所以继续点属性即可。绑定的时候,是可以一直点下去的,只要属性的属性还有属性,就可以这么做。

这样,一个完整的MVVM框架和数据绑定就完成了。好了,今天就写这么多, 一不小心又是凌晨1点半了。最后,欢迎喜欢uwp开发的同学加群学习交流:193148992。 最后晒一下这个绑定页面的效果。

——IT追梦园

时间: 2024-10-26 00:20:20

uwp开发:MVVM模式和数据绑定结合使用实战示例的相关文章

Ios 项目从头开发 MVVM模式(一)

1.之前的项目一直用mvc开发ios,发现ios有一个弊端,mvc里,viewcontroller里边有大量的业务逻辑,当不断的修改,会发现只是一个痛苦的过程. 2.之前做wpf,使用过mvvm模式,可以把业务逻辑放到vm模式,vm可以来处理业务逻辑.做过几个ios项目,也想过mvvm模式,但是一直没找到.偶尔看到网上有一个mvvm模式的ios项目,我来尝试从头开始做这个项目,做完之后源码会公开. 3.ok,这个mvvm开源的项目是C-41,有兴趣的可以去网上搜搜. 4.这个项目要关联到一些类

Note7:MVVM模式之数据绑定

一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文 数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM(WPF) 模式的一大支柱. 简而言之,数据绑定就是将两个属性绑定在一起,源属性(source)改变带动目标属性(target)一起改变.这样也减少了事件(Events)的使用. 绑定源可以是任意对象的属性,而目标必须是依赖对象的依赖属性. 绑定源主要分为以下几种场景(后面主要介绍前两种): (1)依赖

Ios 项目从头开发 MVVM模式(三)

1.话说,本来想做个聚合查询功能,但是我的重点想研究xmpp聊天功能.所以使用mvvm模式做了完全模式51job主界面的页面. 2.首先给大家看我运行起来的界面. 3.界面很简单,做这个界面主要是为了比较mvvm模式和mvc模式之间的区别. 4.这个界面的结构是下边这张图片 与mvc相比,我多了一个viewmodel文件. mvc之前是把业务逻辑和数据放在viewcontroller里边,逻辑复杂的话,别人维护起来很麻烦. 我就不贴viewcontroller的图片了,我把这个代码上传给大家,大

Ios 项目从头开发 MVVM模式(二)

1.这个项目昨天我想了下,有三大部分,第一部分是根据聚合进行在线数据的一个查询功能,第二部分是xmpp的聊天功能,第三部分是更多功能. 2.在线查询功能,主要用到的技术,就是get请求或者是post请求,这个在线查询功能,我们用到的是聚合的SDK,有自己的API,所以我们就需要单独的去做一些请求的类. 3.xmpp聊天功能,主要用到xmpp协议,框架我们用ios的XMPPFramework-master这个开源项目,详细的功能,我会再详细考虑. 4.更多功能,就是每一个app都会有的一些设置等功

浅析前端开发中的 MVC/MVP/MVVM 模式

MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类问题而总结出的抽象方法,一种架构模式往往使用了多种设计模式. 要了解MVC.MVP和MVVM,就要知道它们的相同点和不同点.不同部分是C(Controller).P(Presenter).VM(View-Model),而相同的部分则是MV(Model-View). Model&View 这里有一个可

通用Windows应用《博客园-开发者的网上家园》开发(1)——MVVM模式

最近开发了个WP8.1和Windows8.1平台上的应用——<博客园-开发者的网上家园>,基于 Windows Runtime .在此有必要说明一下,WP8.0以前的应用程序是基于Silverlight的,微软为了统一Windows Phone OS 和 Windows RT,从开发人员的角度上,也统一了两个平台上大部分的API,使得开发人员可以共享代码(而不是一次编写,跨平台运行). 本文着重描述MVVM在Windows Runtime应用程序下的表现,关于MVVM模式的理解,可参考园子里 

Android进阶笔记14:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListener(),findViewById()这些不必要的代码,连如BufferKnife那样的InjectView都不需要,因为你的代码一般不需要依赖于这些界面组件信息.下面以一个最简单的AndroidMVVM为例. (1)layout 布局 <LinearLayout xmlns:android="

UWP开发:异步方法返回集合的数据绑定问题

——最近在做UWP开发,其中请求API数据的时候,往往是通过异步请求网络,再处理json数据,返回集合对象.通常,我们的做法是将集合数据在ViewModel层进行处理,让ViewModel实现ObservableCollection接口,然后在View层后台实例化ViewModel对象,前台绑定对象.这样就实现了集合的绑定和通知.这里需要注意,集合的绑定,不单单是绑定,而且要实现绑定通知,才算真正的绑定. 为什么这么说呢?看一下在开发中遇到的问题: 由于一个简单的页面,需要绑定一组集合数据,因为

WPF中使用MVVM模式进行简单的数据绑定

计划慢慢整理自己在WPF学习和工作应用中的一些心得和想法,先从一个简单的用法说起 在WPF中,XAML标记语言中绑定数据,而数据源就是指定为ViewModel类,而非界面本身的逻辑代码类 这样一定程度上达到界面与业务逻辑分离的思想,UI层只需要对ViewModel类进行依赖,只要ViewModel公开出来的属性不变,界面层就不用根据业务逻辑变化而进行修改 这大概就是MVVM模式的一个基本出发点,配合WPF的依赖属性和命令等结合使用,会有更复杂的用法及更好的效果 这里先从一个简单的数据绑定用法为例