如何在Silverlight中为ObservableCollection <t>创建CollectionView </t>

时间:2009-03-22 23:44:05

标签: c# silverlight

我正在使用silverlight,我想要提交一个ObservableCollection。

所以我开始关注ICollectionView,因为Silverlight中没有CollectionViewSource,它包含大量的方法和事件。我已经搜索了一段时间,我想知道是否有人有ICollectionView实现的示例代码?

3 个答案:

答案 0 :(得分:6)

CollectionViewSource现在可在Silverlight 3中使用。查看一篇关于此here的好文章。

答案 1 :(得分:1)

不幸的是,ICollectionView仅用于Silverlight 2.0中的DataGrid,它唯一的实现是ListCollectionView,它是System.Windows.Controls.Data内部的。

如果你没有绑定到DataGrid,ICollectionView不会给你太多,因为据我所知,它没有被基本控件(例如listbox)使用,因为它是在Data控件程序集中定义的而不是在核心。

这与WPF有很大的不同。

但是就你的问题而言,包含DataGrid的程序集确实有一个可以帮助你的实现,如果你想了解它是如何完成的。最坏的情况,反射器是你的朋友......

答案 2 :(得分:1)

如果要对ObservableCollection进行数据绑定,一种方法是使用值转换器。

另一种方法是在ViewModel CLR对象中使用LINQ,该对象将根据ViewModel中的属性进行过滤,如下所示(参见底部的实现方法UpdateFilteredStores()):

namespace UnitTests
{
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Collections.Specialized;
    using System.ComponentModel;
    using System.Linq;

    public class ViewModel : INotifyPropertyChanged
    {
        private string name;

        public ViewModel()
        {
            this.Stores = new ObservableCollection<string>();

            this.Stores.CollectionChanged += new NotifyCollectionChangedEventHandler(this.Stores_CollectionChanged);

            // TODO: Add code to retreive the stores collection
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        public ObservableCollection<string> Stores { get; private set; }

        public IEnumerable<string> FilteredStores { get; private set; }

        public string Name 
        { 
            get
            {
                return this.name;
            }

            set
            {
                this.name = value;

                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                }

                this.UpdateFilteredStores();
            }
        }

        private void Stores_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            this.UpdateFilteredStores();
        }

        private void UpdateFilteredStores()
        {
            this.FilteredStores = from store in this.Stores
                                  where store.Contains(this.Name)
                                  select store;

            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("FilteredStores"));
            }
        }
    }
}