スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

Viewを更新中のUI更新を後回しにしたいんだ

Viewを更新させるとき、何も処置をしないとリアルタイムでビューが更新されるようで。パフォーマンス的に非常によろしくない。実用に耐えられないぐらい。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;

...
//ビュー(既定)を取得する。
var listView = CollectionViewSource.GetDefaultView(PersonsList) as ListCollectionView;

//FirstNameプロパティで昇順にソート
listView.SortDescriptions.Add(
new SortDescription("FirstName", ListSortDirection.Ascending);


↑のように何もせずにソートを実行したりすると、もう大変だ。100件程度ならどうって事はない。ただ、これが数千件になると、望まない「溜め」を生む事になる。
ソートすると、一旦すべてのLoad中のDataGridRowをアンロードして、必要な分のDataGridRowをロードするようで。UI仮想化してないともう悲惨です。UI仮想化していても大変です。
その更新を後回しにできるメソッドがビューにはある。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;

...
//ビュー(既定)を取得する。
var listView = CollectionViewSource.GetDefaultView(PersonsList) as ListCollectionView;

//FirstNameプロパティで昇順にソート
using (listView.DeferRefresh()) {
listView.SortDescriptions.Add(
new SortDescription("FirstName", ListSortDirection.Ascending);
}

DeferRefreshメソッドで更新を待ってもらう。usingを抜けた後で更新される。
こうすることでパフォーマンスを上げることができる。ただし、このメソッド、いつでも使えるわけではない。
アイテムを追加していたり、セル編集中にソートを実行して、このDeferRefreshを読んだりすると、落ちるんだ。
なので、事前に確認する必要がある。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;

...
//ビュー(既定)を取得する。
var listView = CollectionViewSource.GetDefaultView(PersonsList) as ListCollectionView;
//編集中ならキャンセル
if (listView.IsEditingItem) {
listView.CancelEdit();
}
//追加中ならキャンセル
if (listView.IsAddingNew) {
listView.CancelNew();
}

//FirstNameプロパティで昇順にソート
using (listView.DeferRefresh()) {
listView.SortDescriptions.Add(
new SortDescription("FirstName", ListSortDirection.Ascending);
}

列クリックによるソート等は、対策がなされているの(編集中にソートするとキャンセルされている)で、自分がViewModel側からソートする時のみ注意が必要となる。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。