0

をコレクションにバインドしようとしていますが、コレクションが設定された後GridViewに更新したいと思いGridViewます。

私が使用しない理由ObservableCollectionは、コレクションが大きい場合(1000アイテムを超える場合、すべてのアイテムが追加された後にすべてのアイテムを表示したい)、UIをブロックするためです。メトロスタイルアプリには、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;

誰かが私に提案を与えることができますか?ありがとう!

4

1 に答える 1

0

コード上で、GridViewはItemsSourceをviewCollectionにバインドしています。通知されない理由が欠落しているのは、RaiseChanged()メソッドだけです。

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

もう1つ、RaiseChangeメソッドにstringプロパティを配置することはお勧めしません。少なくとも文字列プロパティ名を受け入れ、PropertyChangedEventArgsに渡す必要があります。

XAMLのUIコントロールを通知/更新する理想的なプロパティは次のようになります

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

したがって、ViewCollectionをViewModelのどこかに設定するとします。GridViewを更新する必要があります。

于 2012-08-01T13:58:57.173 に答える