Silverlight中使用MVVM(1)--基础

Silverlight中使用MVVM(2)—提高

Silverlight中使用MVVM(3)—进阶

Silverlight中使用MVVM(4)—演练

本来打算用MVVM实现CRUD操作的,这方面例子网上资源还挺多的,毕竟CRUD算是基本功了,因为最近已经开始学习Cailburn框架了,感觉时间

挺紧的,这篇就实现其中的更新操作吧。

        

功能很明确,当我们更改DataGrid中的CheckBox时,将源中当前发生变化的数据项在界面上显示出来。我们仍然在前面项目的基础上实现这个功能

首先我们需要给实体Person类添加一个Bool的属性,因为这里我们只对这个属性值操作,所以对于age,name属性也就无必要实现更改通知了

        public class Person:INotifyPropertyChanged
      {
        public int age { get; set; }
        public string name { get; set; }
        private bool _isBoy;

        public bool IsBoy
        {
            get { return _isBoy; }
            set { _isBoy = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("IsBoy"));
            }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
      }

我们仍然从Persons中获取数据集合,这里我们因为操作时源集合将发生变化,所以这里我们继承了ObservableCollection<T>类

         public class Persons:ObservableCollection<Person>
        {
        public Persons() : base()
        {
        }
        public new event PropertyChangedEventHandler PropertyChanged;
        public new void Add(Person person)
        {
            //添加项时自动绑定,并且向上传递发生改变的属性
            ((INotifyPropertyChanged)person).PropertyChanged += (obj, e) =>
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(obj, new PropertyChangedEventArgs(e.PropertyName));
                }
            };
            base.Add(person);
        }
        }

这里的Persons类通过new关键字隐藏了ObservableCollection<Person>原来的事件和方法,在Persons类中这里我们还需要

添加一个获取源数据的集合

       public Persons GetPerson()
        {
            //获取数据源集合
            Persons getAllpersons = new Persons();
            for (int i = 1; i < 4; i++)
            {
                getAllpersons.Add(new Person() {age=i,name="Student"+i,IsBoy=true});
            }
            return getAllpersons;
        }

现在对于Model我们已经完成了工作,下面就是修改ViewModel了,这个部分其实没有太大的变化

        public Persons GetPersons { get; set; }
        public PageViewModel()
        {
            GetPersons = new Persons().GetPerson();
            //数据源发生变化时的操作
            GetPersons.PropertyChanged += (obj, e) =>
            {
                Person person = (Person)obj;
                MessageBox.Show(string.Format("CurrentDetailes:{0},{1},{2}",person.name,person.age,person.IsBoy));
            };
        }

我们对于这个GetPersons这个源集合进行了一个操作,就是当它的属性发生变化时执行一个动作,这里我们只是用对话框将当前项显示出来

对于UI,我们仍然只是用之前的Xaml

        <data:DataGrid ItemsSource="{Binding GetPersons}"  AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Name="dataGrid1"  />

最后我们将View和Model都放入MainPage页面中

        <UserControl.Resources>
        <vm:PageViewModel x:Key="model"></vm:PageViewModel>
        </UserControl.Resources>
        <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource model}">
        <viw:PageView></viw:PageView>
        </Grid>

好了,这样我们的功能就实现了。不过在这里我们还是可以考虑一点东西的,真实情况是我们的实体类不会只是一个,那么我们就要重复为每一个实体类实现ObservableCollection<T> 类了,这时可能你已经想到用泛型了,我们把集合用泛型实现.

对于Persons类,我们将其改为泛型集合

       public class ViewModelCollection<T> : ObservableCollection<T>
       {
        public ViewModelCollection() : base()
        {
        }
        public new void Add(T item)
        {
            ((INotifyPropertyChanged)item).PropertyChanged += new PropertyChangedEventHandler(ViewModelCollection_PropertyChanged);
            base.Add(item);
        }
        public new event PropertyChangedEventHandler PropertyChanged;
        void ViewModelCollection_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(sender, new PropertyChangedEventArgs(e.PropertyName));
            }
        } }

ViewModel中:

        public ViewModelCollection<Person> GetPersons{get;set;}
        public PageViewModel()
        {
            GetPersons = GetMan();
            //数据源发生变化时的操作
            GetPersons.PropertyChanged += (obj, e) =>
            {
                Person person = (Person)obj;
                MessageBox.Show(string.Format("CurrentDetailes:{0},{1},{2}", person.name, person.age, person.IsBoy));
            };
        }
         public static ViewModelCollection<Person> GetMan()
        {
            //获取数据源集合
            ViewModelCollection<Person> getAllpersons = new ViewModelCollection<Person>();
            for (int i = 1; i < 4; i++)
            {
                getAllpersons.Add(new Person() { age = i, name = "Student" + i, IsBoy = true });
            }
            return getAllpersons;
        }

整体上的是一致的,只不过之前,因为实体类单一,所以我一直将数据源固定在Model模块中的,那么用泛型之后,我就将这个获取数据源的行为就移动到对应的ViewModel中了,这样实现更为优雅一些。

其实通过这个循序渐进的过程,很容易让人感觉的到,从开始到现在除非我们需求的改变,很少修改UI,几乎大部分重构或者修改都是在ViewModel中实现,这个也的确让人体会到UI与逻辑分离带来的方便之处,同时经过MVVM的分离形式,我感觉对于程序的调试也比先前容易定位。

的确,MVVM模式如果再结合一些主流的框架,可以完成许多丰富的功能,当然这已经是另一个话题了,这里仅仅实现了更新功能,关于MVVM模式的CRUD的完整实现可以参考网上的资源,也可以参考这篇文章

代码下载:UpdateByMVVM VS2010+SL3

原文引入:http://www.cnblogs.com/626498301/archive/2010/08/20/1804155.html

Silverlight中使用MVVM(4)的更多相关文章

  1. Silverlight中使用MVVM(1)--基础

    Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 ...

  2. Silverlight中使用MVVM(3)

    Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 ...

  3. Silverlight中使用MVVM(2)

    Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 ...

  4. Silverlight中使用MVVM(1)

    Silverlight中使用MVVM(1)   Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 ...

  5. Silverlight中在MVVM模式下对DatagridRow选择控件封装

    在项目中,凡是涉及到表格的地方用的最多的控件,自然少不了DataGrid的身影,它明了的展示各种数据让人十分喜欢.现在要实现一个功能,使DataGrid具有全选和项选中的功能,如果在传统后台代码中完成 ...

  6. 三、Silverlight中使用MVVM(三)——进阶

    这篇主要引申出Command结合MVVM模式在应用程序中的使用 我们要做出的效果是这样的 就是提供了一个简单的查询功能将结果绑定到DataGrid中,在前面的基础上,这个部分相对比较容易实现了 我们在 ...

  7. Silverlight中使用MVVM(2)-(提高)

    在第一篇文章中的示例中,我们已经简单的了解了应用MVVM模式的流程,我的本意是你已经了解了一点MVVM的概念,然后又没有一个较好的例子学习,可以跟着我一起学习MVVM模式,所以这个部分,都是没有理论知 ...

  8. 二、Silverlight中使用MVVM(二)——提高

    在第一篇文章中的示例中,我们已经简单的了解了应用MVVM模式的流程,我的本意是你已经了解了一点MVVM的概念,然后又没有一个较好的例子学习,可以跟着我一起学习MVVM模式,所以这个部分,都是没有理论知 ...

  9. Silverlight中使用MVVM(4)—演练

    本来打算用MVVM实现CRUD操作的,这方面例子网上资源还挺多的,毕竟CRUD算是基本功了,因为最近已经开始学习Cailburn框架了,感觉时间 挺紧的,这篇就实现其中的更新操作吧.         ...

随机推荐

  1. 【Codeforces Round #502 (Div. 1 + Div. 2) 】

    A:https://www.cnblogs.com/myx12345/p/9843032.html B:https://www.cnblogs.com/myx12345/p/9843050.html ...

  2. AtCoder Regular Contest 074F - Lotus Leaves

    $n \leq 300,m \leq 300$,$n*m$的格子里有起点有终点有空地有障碍,人会从起点选一个同行或同列空地跳过去,然后一直这样跳到终点.求至少删掉多少格子使得人跳不到终点. 首先S和T ...

  3. GridView选中,编辑,取消,删除代码

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 2.GridView选中,编辑,取消,删除: 效果图: 后台代码:你可以使用sqlhelper,本文没用。代码如下 ...

  4. readonly和disabled的异同

    好久木有写博客了,今来逛逛 话说今天搞form表单的时候,主管让俺把手机号设成只读的.当时我就...咳咳,然后我就问了下万能的百度君,果断还是有解决方法的嘛,那么,今就谈谈readonly和disab ...

  5. SQL 随机取出一条数据

    今天遇到一需求,需要随机取出一条数据.网上找了下,sqlserver自带的有newID()这个函数,可以随机出来一个guid,用来取随机数还是蛮不错的. 直接上SQL: select top 1 *, ...

  6. dos中定义变量与获取常见的引用变量以及四则运算、备份文件(set用法)

    在dos中使用set定义变量: set  a=8              (注意等号两边没有空格) 引用变量如: echo  %a%        将打印a的值 (%a%是获取变量a的值) dos中 ...

  7. [Bzoj1112][POI2008]砖块Klo(splay)

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2353  Solved: 831[Submit][Statu ...

  8. java基础 6 基本类型与运算

    1 包装类型 Integer的缓存池为   -128 - 127: 八个基本类型   占bit  与字节  8 bit = 1 字节 boolean  1     byte  8    char   ...

  9. 《Java虚拟机原理图解》 1.1、class文件基本组织结构

    作为Java程序猿,我们知道,我们写好的.java 源代码,最后会被Java编译器编译成后缀为.class的文件,该类型的文件是由字节组成的文件,又叫字节码文件.那么,class字节码文件里面到底是有 ...

  10. 高效的MySQL的批插入 BULK INSERT

    原文:http://www.open-open.com/code/view/1453702496573 MySQL的批插入 BULK INSERT和load data的速度差不多,并且可靠. 语法如下 ...