Silverlight中使用MVVM(4)—演练

Silverlight中使用MVVM(4)—演练,第1张

概述  本来打算用MVVM实现CRUD *** 作的,这方面例子网上资源还挺多的,毕竟CRUD算是基本功了,因为最近已经开始学习Cailburn框架了,感觉时间 挺紧的,这篇就实现其中的更新 *** 作吧。                   功能很明确,当我们更改DataGrid中的CheckBox时,将源中当前发生变化的数据项在界面上显示出来。我们仍然在前面项目的基础上实现这个功能 首先我们需要给实体Person   本来打算用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,monospace; Font-size:11px">                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);
        voID viewmodelCollection_PropertyChanged(object sender,PropertyChangedEventArgs e)
                PropertyChanged(sender,monospace; Font-size:11px">        } }

viewmodel中:

        public viewmodelCollection<Person> GetPersons{get;set;}
        {        
            GetPersons = GetMan();
         public static viewmodelCollection<Person> GetMan()
            viewmodelCollection<Person> getAllpersons = new viewmodelCollection<Person>();
                getAllpersons.Add(new Person() { age = i,name = "Student" + i,IsBoy = true });
        }

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

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

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

总结

以上是内存溢出为你收集整理的Silverlight中使用MVVM(4)—演练全部内容,希望文章能够帮你解决Silverlight中使用MVVM(4)—演练所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1016170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存