[Silverlight入门系列]使用MVVM模式(2):集合

阅读更多

Model /ObservableCollection/ICollectionView

 

上一篇讲了《[Silverlight入门系列]使用MVVM模式(1):MVVM核心概念 》,今天讲一下集合Model。所谓集合Model就是给ItemsControl,如DataGrid,Combobox等绑定的集合数据模型。另外,通过定制ItemsControl的数据模板(DataTemplate),还可以控制集合对象中每一项的显示。实现很简单,但数据源集合对象必须继承IEnumerable接口,为了让目标属性与数据源集合的更新(不但包括元素的修改,还包括元素的增加和删除)保持同步,数据源集合还必须实现INotifyPropertyChanged接口和INotifyCollectionChanged接口。

ObservableCollection

在Silverlight中创建数据源集合可以使用内建的ObservableCollection类,因为ObservableCollection类既实现了INotifyPropertyChanged接口,又实现了INotifyCollectionChanged接口。使用ObservableCollection类不但可以实现Add、Remove、Clear和Insert操作,还可以触发PropertyChanged事件。

     
     
     
     
1 using System.Collections.ObjectModel; 2 using System.Collections; 3 4 public class MyModelCollection : ObservableCollection<MyModel> 5 { 6 public MyModelCollection() 7 { 8 } 9 10 public MyModelCollection(IEnumerable MyModels) 11 { 12 foreach (MyModel h in MyModels) 13 this .Add(h); 14 } 15 16 public void AddRange(IEnumerable MyModels) 17 { 18 foreach (MyModel h in MyModels) 19 this .Add(h); 20 } 21 } 22 23 public class MyModel 24 { 25 public int ModelID { get; set ; } 26 public string ModelName { get; set ; } 27 } 28 29 public class MyViewModel 30 { 31 public MyModelCollection MyModelDataCollection { get; set ; } 32 public MyViewModel(MyModelCollection modelCollection) 33 { 34 MyModelDataCollection = modelCollection; 35 } 36 }

集合Model绑定到ItemControl也很简单:

     
     
     
     
1 private MyViewModel viewModel; 2 3 public MainPage() 4 { 5 InitializeComponent(); 6 7 MyModel m1 = new MyModel() { ModelID = 1, ModelName = "abc" }; 8 MyModel m2 = new MyModel() { ModelID = 2, ModelName = "def" }; 9 10 viewModel = new MyViewModel(new MyModelCollection(new List<MyModel> () { m1, m2 })); 11 12 this.DataContext = viewModel; 13 14 this.dataGrid1.ItemsSource = viewModel.MyModelDataCollection; 15 this.dataGrid1.AutoGenerateColumns = true ; 16 17 this.comboBox1.ItemsSource = viewModel.MyModelDataCollection; 18 this.comboBox1.DisplayMemberPath = "ModelName" ; 19 this.comboBox1.SelectedValuePath = "ModelID" ; 20 21 this.comboBox1.SelectionChanged += new SelectionChangedEventHandler(comboBox1_SelectionChanged); 22 } 23 24 void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 25 { 26 this.textBlock1.Text = "Selected value: " + this .comboBox1.SelectedValue; 27 }

ICollectionView / PagedCollectionView

虽然上述的ObservableCollection很好用而且继承了INotifyPropertyChanged接口,有些时候我们需要对集合进行排序、过滤、分页等操作,这个时候就需要用ICollectionView接口,同样继承了INotifyPropertyChanged接口。ICollectionView接口在Silverlight下有个子类:PagedCollectionView,在WPF下有个子类:ListCollectionView.

PagedCollectionView例子:

C#:

     
     
     
     
1 public class MyViewModel : INotifyPropertyChanged 2 { 3 public ICollectionView Customers { get; private set ; } 4 5 public MyViewModel( ObservableCollection<Customer> customers ) 6 { 7 // Initialize the CollectionView for the underlying model 8 // and track the current selection. 9 Customers = new PagedCollectionView( customers ); 10 Customers.CurrentChanged += 11 new EventHandler( SelectedItemChanged ); 12 } 13 14 private void SelectedItemChanged( object sender, EventArgs e ) 15 { 16 Customer current = Customers.CurrentItem as Customer; 17 ... 18 } 19 }

XAML:

     
     
     
     
1 <ListBox ItemsSource="{Binding Path=Customers}"> 2 <ListBox.ItemTemplate> 3 <DataTemplate> 4 <StackPanel> 5 <TextBlock Text="{Binding Path=Name}"/> 6 StackPanel> 7 DataTemplate> 8 ListBox.ItemTemplate> 9 ListBox>
引用地址: http://www.cnblogs.com/Mainz/archive/2011/05/04/2036680.html

你可能感兴趣的:(Silverlight,WPF)