如何在设置集合后更新gridview

时间:2012-07-31 09:28:44

标签: gridview microsoft-metro observablecollection inotifypropertychanged

我正在尝试将GridView绑定到集合,并且我想在设置集合后更新GridView

我不使用ObservableCollection的原因是,如果集合很大(超过1000个项目,并且我想在添加所有项目后显示所有项目),它将阻止UI。 在metro风格的app中,没有用于C#的BindingList类,所以我需要实现自己的集合类吗?我尝试实现一个继承了IListINotifyPropertyChanged的类。

我做了类似的事情:

<GridView x:Name="ItemsGridView" ItemsSource="{Binding viewCollection}"/>

class MyBindingList<T> : IList<T>, INotifyPropertyChanged
{
    private List<Item> _viewCollection = new List<Item>();
    public List<Item> viewCollection 
    { get { return _viewCollection; } set { _viewCollection = value; } }
    public virtual event PropertyChangedEventHandler PropertyChanged;
    public void RaiseChanged()
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs("viewCollection"));
    }
}
MyBindingList<Item> list = new MyBindingList<Item>();
ItemsGridView.DataContext = list;

有人可以给我一个建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

在您的代码中,您的GridView将其ItemsSource绑定到viewCollection。你唯一不知道为什么它没有通知是RaiseChanged()方法。

  public List<Item> viewCollection 
{ get { return _viewCollection; } set { _viewCollection = value; RaiseChanged(); } }

还有一件事,我不建议将字符串属性放在你的RaiseChange方法上。它应该至少接受一个字符串属性名称并将其传递给PropertyChangedEventArgs。

通知/更新XAML中UI控件的理想属性如下所示

public List<Item> viewCollection 
    { get { return _viewCollection; } set { _viewCollection = value; NotifyPropertyChanged("viewCollection"); } }

假设您要在ViewModel中的某个位置设置viewCollection。它应该更新GridView。