1

エンドレスリストボックス(ユーザーが最後までスクロールしたときにデータのチャンクをロードするリストボックス)を実装する必要があり、ViewModelを使用しています。

ListBoxをObservableCollectionにバインドしていますが、ListBoxの最後に到達したことについて通知を受け取り、MVVMパラダイムを破らないようにする方法がわかりません。どうすればこれを達成できますか?

私が知る必要がある唯一のことは、MVVMの機能と制約を保持し、コレクションが最後まで列挙されたときに通知を受け取る方法です。

ありがとう。

編集

私は少し掘り下げてきましたが、これは簡単な解決策ではないのではないかと思います。唯一の可能性は、ICollectionとINotifyCollectionChangedを実装するカスタムコレクションを実装することだと思います。しかし、ListBoxやその他のItemsSource対応コントロールの内部メカニズムがどのように機能するかわからないため、遅延読み込みを実装する方法がわかりません。

ItemsSourceを利用するWPコントロールの主要なフェッチメカニズムはIEnumerableインターフェイスですか?それともインデクサーメソッドを使用していますか?どのようにカウントを呼び出しますか?それはカウントに依存しますか、それともライフシクルの間に変更できますか(そしてどの呼び出しで?すべての呼び出しがカウントを変更してからNotifyCollectionChangedを呼び出すことができるわけではないと思います)。

ドキュメントはありますか?または、利用可能な実装はありますか?

4

2 に答える 2

2

これはMVVMをサポートするはずなので、イベントをリストボックスの一部としてではなく、コレクション自体の一部として結び付けます。要求されたインデックスがリストの最後に近づいたら、チャンクを追加してみてください。

これを実現する1つの方法は、IListから継承し、this[int index]プロパティを監視することです。

例えば:

public class OC<T> : IList<T>, IList
{
    public T this[int index]
    {
        get
        {
            if  (index >= (this.Count - 20)) // Insert correct heuristics here!
            {
               // Load more chunks
            }
            return base[index];
        }
    }
}

(もちろん、これを行うための最良の方法Count - 20ではなく、おそらく独自のヒューリスティックを入力する必要があります(おそらく、インデックスが最後の10%にある場合)が、概念を示しています)

このように、ビューがリストボックスまたはコンボなどを使用しているかどうかは関係ありません-MVVMパターンを維持しています。要求された現在のアイテムがリストの最後にあるアイテムである場合、それはより多くのチャンクのロードを開始するためのキューです...

IList仮想化の場合、WPFはIList(ジェネリックなし)をチェックしているようであり、IList<T>から派生していないため、から派生することもできますIList。簡単に言うと、派生していない場合はIList 、リスト内の各アイテムに対してインデクサーが呼び出されます。

于 2012-11-07T11:53:06.367 に答える
1

MVVM を壊さずに、この問題に対する非常に洗練された解決策を提供する素晴らしい解決策を見つけました (一見したところ、まだ適切に調査していないようです) http://danielvaughan.orpius.com/post /Scroll-Based-Data-Loading-in-Windows-Phone-7.aspx

そのためのstackoverflowトピックもありますが、見落としていました。最後のアイテムに到達したら、WP7 Auto Grow ListBox を見てください。

于 2012-11-07T14:32:31.430 に答える