我正在使用silverlight,我想要提交一个ObservableCollection。
所以我开始关注ICollectionView,因为Silverlight中没有CollectionViewSource,它包含大量的方法和事件。我已经搜索了一段时间,我想知道是否有人有ICollectionView实现的示例代码?
答案 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"));
}
}
}
}