なぜListCollectionView.CustomSortが遅くなるの?
-
19-09-2019 - |
質問
私は ObservableCollection
のViewModelsるに座るコンポーネントのラインナップ DataGrid
.の DataGrid
元の列:
- 位欄をこれによって、実行時に、UserControlを表示する位置を行っ開発を維持-管理
- 名欄をこれによって、実行時に、UserControl表示する列の名前(ありながらプレーする必要がありましUserControlこれに基づかなければならない名前のニーズをすることになりますが、表示するものであるか)
- データ欄をこれによって、実行時になUserControl.
私のカラム定義のようになります:
<toolkit:DataGrid.Columns>
<toolkit:DataGridTemplateColumn Header="" MinWidth="35" MaxWidth="35" SortMemberPath="Position.PositionIndex" CanUserSort="True">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Position}"/>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn Header="Name" MinWidth="150" Width="150" SortMemberPath="Name" CanUserSort="True">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Name}"/>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn Header="Data" Width="Auto" CanUserSort="False">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Data}"/>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
</toolkit:DataGrid.Columns>
なので、私の列名を列UserControlsのコンポーネントのラインナップ DataGrid
できないネイティブ並べ替えます。うためのソート、カラムヘッダーをクリックすると、人生を楽しむことができるように ListCollectionView.CustomSort
マジックがあります。
ここでは私にカスタムソーターのように見えるカラム名:
// Customized sorter, by name, ascending.
public class AscendingNameSorter : IComparer
{
public int Compare(object x, object y)
{
var lhs = (MyViewModel)x;
var rhs = (MyViewModel)y;
return lhs.Name.CompareTo(rhs.Name);
}
}
// Customized sorter, by name, descending.
public class DescendingNameSorter : IComparer
{
public int Compare(object x, object y)
{
var lhs = (MyViewModel)x;
var rhs = (MyViewModel)y;
return rhs.Name.CompareTo(lhs.Name);
}
}
問題はこれは 非常に遅い.ないで行うのではないでしょうか。10項目の DataGrid
, 私の応用研磨止のためには3~4秒で出しています。と思った ListCollectionView.CustomSort
しなければならない最も効率的な方法並べ替える ObservableCollection
...明日へ向かって走れは間違いだったのか?
解決
コンポーネントのラインナップで再現すべてのUserControlsごとに並べ替え、だと思うのであるとともに、工事の管理が遅くなります。もみのようですね。
べき開始による絞り込みの問題です。このワークショップをお勧めします:
ぐる動作では3~4秒です。すな状態かどうかの遅延が起こる場合のみに提供価値をCustomSort、毎回のリスト変更後のCustomSortがセットされています。ことができます。
加えてみ通常の文字列の選別がされている"うるかどうかがイノベーションを再構築するにはいません。うまく行ったことがなかったか疑問です。
診断目的で一時的に停止設定CustomSort設定ListCollectionView.フィルターです。設定したフィルタは常にtrueを返します。だまだまだ行けそうな景気減速の問題に関連しListCollectionViewめようとする取り組みを再編成します。
一時的に編集テンプレート置換のカスタムUserControlsと些細なもの(例えば
<CheckBox/>
この場合も速います。の投資を維持しながら、生産性、コンストラクタのUserControlsだいているという想される回数(ie10コンストラクタ求がある場合は10項目のリストになっているという時に、予想以上のスタックトレース場の話。
追加のコードがUserControlコンストラクタのDateTime.現在のコンストラクタしてしまっており、これらの出力のウィンドウ(もしくはログなど).これまで過ごせばよいかを教えてくれるのかれていくことと捉えています。
追加数百項目におObservableCollection、アプリ側と共にVS.NETをクリックしおうボタン(も)ってのすべてのボタンVS.NET がない限り、スタックトレース.ヒットを続け、すぐに打破すべて、そのスタックトレース。繰り返しました。これは良いアイデアを与えるだろうのに何が起きているすべての余分の時間。
となれば、疑い、問題が遅いUserControls創造と結合す:問題は起こるべてのリストの変化も起こる変更された場合には、メモを取るフィルターも高速化交換の際は、おUserControlsと <CheckBox/>
, は、コンストラクタにだけ呼び出された項目の時間の間に通話するlargish.
ご注意い、ということではありませんので コンストラクタ のUserControlsるのが遅いを付与することができるのUserControl instantiates多くのサブオブジェクトでは、ドラッグアンドドロップでき、またはこのオブジェクトの遅れは、subobjectを読み込むファイル、または他の多くできます。ディアスをインスタンス化DataTemplateのオブジェクトの追加で、ツリーの視覚は誰にでも遅くなります。のスタックトレースするべくようなことが多いです。
だが何かできないので、更新をおうかがいすることにより情報を上記試験が開示されるまでを支援していきます。