問題タブ [data-virtualization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - WPF DataGrid 列の仮想化
DataGrid で水平仮想化を実行しようとしています。私のコレクションのタイプは次のとおりです。
最初の次元の長さは 64 で、2 番目の次元の長さはおよそ 5000 です
垂直仮想化を実現するために、 Paul McClean の VirtualCollectionを使用しています。
私の IItemsProvider は、テーブル内の行を表す string[] のアイテムを返す Iterator をカプセル化します。
マイ アイテム プロバイダー:
イテレータ:
}
上記を要約すると、 VirtualCollection を介して特定の範囲の string[] のアイテムを受け取ります。
私が今試みているのは、列も仮想化することです。私の列は実行時に特定の Extent によって生成されます。これは、静的クラス DataGridBuilderUtil の添付プロパティのコールバックで行われます
cs:
DataGridBuilderUtil では、水平範囲が変更されたときに、DataGrid の ScrollViewer ScrollChanged イベントも添付します。
1) 新しい列を追加します。
2) 別の列に対応するために Iterators Extent を更新します。
3) 同じ位置に垂直に再スクロールします。これにより、IList から派生した ItemsSource (VirtualCollection) が作成され、インデックスのクエリが実行され、現在のページが再度要求されます (フラグ IsDefferedLoadPageRequired の助けを借りて)。
だから今、VirtualCollectionの中に
ItemsProvider を要求します:
これは Iterator を要求します。別の列に対応するために Extent がインクリメントされたことを思い出してください。
これで、文字列 [20] アイテムがインクリメントされた文字列 [] アイテムが文字列 [21] になりました。私の水平方向のデータ仮想化は機能しました。
問題は、この方法でバインドされている私のセルです:(上記の CreateColumn メソッドから)
新しい列の各セルにバインディング エラーがあります(コレクションの読み込み時に生成された元の列のバインディングは正常に機能します:
これは、列が作成されたときにその行の配列項目にそのインデックスが含まれていないという事実に関係していると思います。代わりに、配列が更新された後に列を作成しようとしました。
それは同じ結果でした。
ここでの大きな問題は、なぜバインディングが機能しないのか、バインディングを更新するにはどうすればよいのかということです。
さらに、DataGrid.EnableColumnVirtualization = True を設定して、これをすべてまとめます (バインディングが機能する場合)。
編集 :
コレクションが更新された後に列を作成しようとしました:
OnLoadComplete は、VirtualCollection が現在のページを再読み込みした後に発生します。
wpf - 仮想化されたリストを使用した VirtualizingStackPanel
リスト/グリッドのようなもので、他の場所 (データベースなど) からロードされたかなり大量のアイテムを表示するアプリケーションを開発しています。
すべての項目を常にメモリに保持しておくのはもったいないので、リストの一部を仮想化する方法を検討しています。VirtualizingStackPanel
私が必要としているもののように思えます - ただし、アイテムのUIを仮想化するのはうまくいくようですが、基礎となるアイテムリスト自体の一部を仮想化する方法がわかりません.
小さなサンプルとして、これをメイン ウィンドウとする WPF アプリケーションを考えてみましょう。
リストを提供するコード ビハインドは次のようになります。
したがって、これは を含むアプリケーションを表示し、添付プロパティListBox
を使用して項目を強制的に仮想化します。データ コンテキストからアイテムを取得します。このカスタム実装には、オンザフライで 10000 個のデータ アイテムを作成する (インデクサー経由で取得した場合) が提供されます。IsVirtualizing
IList<T>
デバッグの目的で、アイテムが作成されるたびにテキストADD #
(#
アイテム インデックスに等しい) が出力され、アイテムがビューから外れてその UI が仮想化スタック パネルによって解放されると、CleanUpVirtualizedItem
イベントが出力に使用されます。DEL #
今、私の願いは、カスタム リストの実装が要求に応じてアイテムを提供することです。この最小限のサンプルでは、オンザフライでアイテムを作成し、実際のプロジェクトではデータベースからアイテムをロードします。残念ながら、VirtualizingStackPanel
このようには動作しないようです。代わりに、プログラムの開始時にリストの列挙子を呼び出し、最初に 10000 個のアイテムすべてを取得します!
したがって、私の質問は次のとおりです。GUI要素の数を減らすだけでなく、データの実際の仮想化(すべてのデータをロードしないなど)にVirtualizingStackPanelを使用するにはどうすればよいですか?
- 列挙子を使用するのではなく、仮想化スタック パネルにアイテムの総数を伝え、必要に応じてインデックスでアクセスするように指示する方法はありますか? (たとえば、私の記憶が正しければ、Delphi Virtual TreeView コンポーネントは機能します。)
- アイテムが実際に表示されたときにイベントをキャプチャする独創的な方法はありますか?少なくとも、通常は各アイテムの一意のキーを保存し、要求されたときに残りのアイテム データのみをロードできますか? (ただし、WPF API を満たす以外に、実際の理由もなく完全な長さのリストを提供する必要があるため、これはハッキーな解決策のように思えます。)
- この種の仮想化により適した別の WPF クラスはありますか?
編集:開発ヘッジホッグのアドバイスに従って、カスタムICollectionView
実装を作成しました。一部のメソッドは s をスローするように実装されてNotImplementedException
いますが、ウィンドウが開かれたときに呼び出されるメソッドは実装されていません。
ただし、そのコレクション ビューに対して最初に呼び出されるのは、GetEnumerator
10000 個の要素すべてを再度列挙するメソッドであるようです (デバッグ出力で証明されているように、1000 番目のアイテムごとにメッセージを出力します)。避けるために。
問題を再現する例を次に示します。
Window1.xaml
Window1.xaml.cs
metadata - Marklogicでメタデータカタログを作成する
Marklogic を使用して、RDBMS、xml ファイル、Web サービスなどの複数のソースからのデータを結合しようとしています。これについては、Metadata Catalog ( https://www.marklogic.com/solutions/metadata-catalog/ )、Data Virtualization ( https://www.marklogic.com/solutions/data-virtualization/ )に関する MarkLogic のドキュメントからわかるようにおよびデータの統合は非常に可能です。しかし、それをどのように正確に行うか、またはこれを達成するためにどのツールを使用するかを説明するドキュメントを手に入れることができません。
いくつかの指針を探しています。
c# - DataVirtualizationMode.Automatic を使用した Telerik RadJumpList
DataVirtualizationMode.Automatic で Telerik ジャンプ リストを使用しようとすると問題が発生しますが、動作させることができません。これを使用したい理由は、アプリが毎回データ全体ではなく、ジャンプ リスト コントロールの現在のビューにあるデータ (ゲーム) のみをダウンロードするようにするためです。たとえば、"Batman" を検索して 50 のゲームが返された場合、すべてのゲームをダウンロードしてロードするのではなく、ジャンプ リスト コントロールに表示されるゲームだけをダウンロードしてロードする必要があります。
Telerik の DataVirtualizationMode.Automatic の使用例を次に示しますが、自分のアプリで動作させることができませんでした: http://www.telerik.com/help/windows-phone/raddataboundlistbox-features-datavirtualization-automatic.html
以下は、データ仮想化で使用したいジャンプ リスト コントロールです。
MainPage.xaml:
以下は、DataContext を GameData クラスの GetGamesListItems ObservableCollection にバインドする場所です。imgBtnSearchGame_Click イベント メソッドは、ユーザーがテキスト ボックス txtSearch に「Batman」などと入力してボタンをタップしたときに呼び出され、テキストを GetGamesListData メソッドに送信します。
MainPage.cs:
以下は、検索したゲーム名の XML 形式のデータをダウンロードする場所です。たとえば、「Batman」の場合、「Batman」を含むすべてのゲームを検索して返します。「BoxArtFrontThumb」プロパティは、各ゲームのすべての画像を保存し、非同期を使用する場所です。これは、ダウンロードして表示する必要がある画像が非常に多い場合があるためです。
GameData.cs
以下は、ゲームの画像を見つけて保存する場所です。
これを十分に説明したことを本当に願っています。この問題を解決するのを手伝ってくれる人がいることを願っています. ありがとう。
c# - グループ化を含むカスタム (フラット) コレクションを作成するにはどうすればよいですか?
私は WPF DataGrid と .Net 4.5 を使用しており、大規模なコレクション用に独自のデータ仮想化コンテナーを展開しようとしています。私は Web のいたるところで、データ仮想化を実装する方法の多くの役立つ例を見つけましたが、私が見たすべての例で、グループ化を行うと節約が失われます。私のグループ化はシンプルで静的です。私のコレクションが事前にすべての項目を列挙する必要がないように、WPF でグループ化を偽造する方法はありますか? たとえば、 をオーバーライドして、各グループの開始時にオブジェクトを返した人ListCollectionView
はいますかGetItemAt()
?CollectionViewGroup
具体例:
- たとえば、100K レコードのデータベースがあるとします。Bea Stollnitz の例に似たデータ仮想化コレクションを作成し、それを WPF DataGrid で使用したいと考えています。
- フィールドの DataGrid 内のアイテムをグループ化したいのですが、データベース クエリを変更して、最初にグループ A のすべてのアイテムを返し、次にグループ B のすべてのアイテムを返すようにします。グループ化は、DataTable がそれを見る前に行われます。
- コレクションが (DataGrid の観点から) フラットであっても、WPF DataGrid 内のグループ化を視覚的に表現するにはどうすればよいですか? DataGrid でグループ化を表示する唯一の方法は、CollectionView などを使用することです。
.
c# - コンボボックスの仮想化の問題
私はvirutalzationを真にしたときにコンボボックススタイルのように奇妙な問題を抱えています.コンボボックスアイテムのすべてのチェックボックスをチェックするチェックボックスがあります.
ItemsPanel プロパティで、以下のように VirtualizingStackPanel を使用してカスタム スタイルを作成しました。
しかし、ビューをスクロールする前と後で、それは異なります。
たとえば、ここでは、アイテムパネルを下にスクロールした後、コンボボックスの最初のアイテムを取得しようとしています
しかし、ここではNULLしか得られません。
では、仮想化を使用してこれを達成できる方法はありますか? (すでに仮想化されていることは知っています!)。または、仮想化をやめて別の解決策を考えるべきです。仮想化プロパティがないと、コンボボックスの読み込みが非常に遅くなることがわかりました。
何かご意見は?
前もって感謝します!:)