首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

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

2012-10-31 
[Silverlight入门系列]使用MVVM模式(2):集合Model /ObservableCollection/ICollectionView?在上一篇讲了《[

[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 MyModel24     {25         public int ModelID { get; set; }26         public string ModelName { get; set; }27     }28 29     public class MyViewModel30     {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

热点排行