我使用ReactiveUI(和Reactive扩展)在UWP应用中创建了一个Grouped GridView / ListView。这很容易做,我甚至可以为显示的列表预先定义一个排序功能和过滤功能。下面是我用来分隔一系列项目的一些代码,无论它们是文件夹还是文件。它们按名称按字母顺序排序。
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。然而,当我做任何这些时,我的视频卡驱动程序几乎崩溃(有时它会崩溃)......屏幕变黑并暂停一秒钟。我不打电话给那个......
在不重绘整个事物的情况下更新Grouped ListView的基础组的正确技巧是什么?
11/9更新
我发现问题在于尝试同时更改多个组的内容。我将整个集合简化为简单的List<ItemGroup<ItemViewModel>>
。然后我联系了一个&#39; sort函数已更改&#39;可以观察到CreateDerivedCollection方法中的reset参数。当它们都获得重置信号时,屏幕变为空白,视频驱动程序出现问题。当我只在一个派生列表上设置reset参数时,它工作正常。该列表自行排序,图形稳定。
它与CollectionViewSource如何同时处理这两个更改有关。我还是很难过。
答案 0 :(得分:0)
我对这个问题有一个hacky解决方案。我几乎确信CollectionViewSource和GridView内部存在一些错误。
我最终为sort函数创建了一个observable,并将其粘贴到第一个DerivedReactiveList上的ShouldReset参数中。然后,我订阅了CollectionViewSource的View的CurrentChanged事件。在那里,我放了一个小Task.Delay(50)
然后启动一个新的observable导致第二个DerivedReactiveList。我必须确保CurrentChanged事件仅从第一个列表更改中启动我的逻辑。
无论如何,它都有效。我需要对我正在使用的排序按钮实施某种去抖。如果我点击它们太快,我会像以前一样得到同样的视频驱动程序崩溃。基本上,我正在同时改变两个列表,这是一个禁忌。