1

カスタム コレクションに INotifyCollectionChanged を実装すると、DataGridView が CollectionChanged イベントをサブスクライブすることを念頭に置いていました。

My Collection は IListSource と INotifyCollectionChanged を実装し、内部 BindingList を持っています。BindingList から ListChanged イベントをサブスクライブし、OnCollectionChanged メソッドを呼び出して CollectionChanged イベントを発生させます。

おそらく、上記を達成するためのより良い方法があり、それを聞いてうれしいです. ただし、現時点での私の主な関心事は、この並べ替えメソッドが呼び出された後に DataGridView を更新することです。

    public void Sort(List<SortField> sortFields)
    {
        if(sortFields == null || sortFields.Count == 0) return;

        IOrderedEnumerable<T> res;

        if (sortFields[0].Ascending)
            res = _items.OrderBy(o => o[sortFields[0].Name]);
        else
            res = _items.OrderByDescending(o => o[sortFields[0].Name]);

        for (int x = 1; x < sortFields.Count; x++)
            if (sortFields[x].Ascending)
                res = res.ThenBy(o => o[sortFields[x].Name]);
            else
                res = res.ThenByDescending(o => o[sortFields[x].Name]);

        Items = new BindingList<T>(res.ToList());
        OnListChanged(this, new ListChangedEventArgs(ListChangedType.Reset, null));
    }

DataGridView が CollectionChanged イベントをサブスクライブするという私の信念は間違っていますか、それとも何か間違ったことをしていますか?

4

1 に答える 1

1

ObservableCollection<T>カスタムコレクションにクラスを使用していると思います。DataGridViewについては知りませんINotifyCollectionChanged。これは WPF バインディング用であり、.NET では使用されませんWinForms

詳細については、このSO の質問を参照してください。

于 2014-02-05T08:36:55.790 に答える