2017-11-08 3 views
0

ReactiveUI(およびReactive extensions)を使用して、UWPアプリケーションでGrouped GridView/ListViewを作成しました。それは非常に簡単ですし、表示されたリストのソート関数とフィルター関数を事前に定義することもできます。以下は、フォルダやファイルであるかどうかにかかわらず、一連のアイテムを分割するために使用したコードです。名前をアルファベット順にソートしています。グループ化されたリストビューを使用すると、IReactiveDerivedListのフィルタまたは並べ替え関数を更新するにはどうすればよいですか?

 var _backingGroups = new ReactiveList<ItemGroup<ItemViewModel>>(); 
     _backingGroups.Add(new ItemGroup<ItemViewModel>() 
     { 
      Title = "Folders", 
      Items = Files.CreateDerivedCollection(
       x => x, 
       x => x.MimeType == "application/vnd.google-apps.folder", 
       (x, y) => x.Name.CompareTo(y.Name) 
      ) 
     }); 

     _backingGroups.Add(new ItemGroup<ItemViewModel>() 
     { 
      Title = "Files", 
      Items = Files.CreateDerivedCollection(
       x => x, 
       x => x.MimeType != "application/vnd.google-apps.folder", 
       (x, y) => x.Name.CompareTo(y.Name) 
      ) 
     }); 

     GroupedFiles = _backingGroups.CreateDerivedCollection(
      x => x, 
      x => x.Count > 0, 
      (x, y) => { if (x.Title == "Folders") { return -1; } else { return 1; } } 
      ); 

これは、素晴らしいですが、私が今欲しいのは動的に並べ替えを変更することです。

私はItemGroups内でDerivedCollectionを再作成しようとしました。私はDerivedCollection全体を再作成しようとしました。しかし、私がそのようなことをすると、ビデオカードドライバがクラッシュすることがあります(時々起こります)...画面が黒くなり、1秒間停止します。私はその作業を呼び出すことはありません...

グループ化されたリストビューの基になるグループを更新する適切な方法は、全体を再描画せずにですか?

更新日11/9 問題は複数のグループの内容を同時に変更しようとしていることがわかりました。全体のコレクションをシンプルなList<ItemGroup<ItemViewModel>>に簡略化しました。そして、私はCreateDerivedCollectionメソッドのresetパラメータに "変更されたソート関数"を観察可能にしました。両方ともリセット信号を受け取ると、画面は空白になり、ビデオドライバに問題があります。派生リストのうちの1つにのみリセットパラメータを設定すると、正常に動作します。そのリストはソートされ、グラフィックスは安定しています。

これは、CollectionViewSourceが両方の変更を一度に処理する方法と関係があります。私はまだ困っている。

答えて

0

私はこの問題を解決するためのヒントを得ています。私は、ここに不具合があるCollectionViewSourceとGridViewの内部に何かがあるとほとんど確信しています。

私はソート関数を変更して最初のDerivedReactiveListのShouldResetパラメータに固定するためのオブザーバブルを作成しました。その後、私はCollectionViewSourceのViewのCurrentChangedイベントを購読します。そこに、私は小さなTask.Delay(50)を入れて、2番目のDerivedReactiveListを引き起こす新たな観測可能性を開始します。私は、CurrentChangedイベントが最初のリストの変更からのみ私のロジックを開始することを確認する必要があります。

いずれにしても、動作します。私は、私が使用している並べ替えボタンのデバウンスのいくつかの種類を実装する必要があります。あまりにも速くクリックすると、前と同じビデオドライバがクラッシュします。本質的に、私は両方のリストを同時に変更しています。それはno-noです。

関連する問題