如何解决C#DynamicData / ReactiveUI-向缓存添加项目时发生意外的明确更改
我正在使用Edit方法对SourceCache进行多次更新。但是,当观察结果集合的更改时,更新将一次返回一次。此外,当达到更新阈值限制25时,将清除并更新整个列表。尽管集合中的项目有效,但基于更改的UI动画并不理想。特别是在清除并重建整个集合的情况下。以下代码段重现了该问题:
示例代码段
public class DynamicDataTest
{
private readonly SourceCache<string,string> _sourceCache = new SourceCache<string,string>(x => x);
private readonly ReadOnlyObservableCollection<string> _collection;
public DynamicDataTest()
{
_sourceCache.Connect()
//.Sort(SortExpressionComparer<string>.Ascending(l => l))
.Bind(out _collection)
.Subscribe();
new SourceList<string>(_collection.ToObservableChangeSet())
.Connect()
.ForEachChange(change => Console.WriteLine(change.Reason.ToString()))
.Subscribe();
_sourceCache.AddOrUpdate("start");
_sourceCache.Edit(source =>
{
for (int i = 0; i < 26; i++)
{
source.AddOrUpdate(i.ToString());
}
});
}
}
我希望它能输出:
Add or AddRange
AddRange
相反,它导致:
AddRange
Clear
AddRange
解决方法
这是预期的行为。
绑定到可观察的集合时,需要进行权衡。当您有许多更改要应用时,发送重置通知通常比同时应用更改要快。重置将挂起通知集合更改事件,然后清除并重新加载列表。之后,它将触发重置。这就是为什么您看到其他“清除/添加范围”的原因
这由绑定运算符中的“重置阈值”选项控制。例如
.Bind(out _collection,resetThreshold:100) //default=25
当要应用100次更改时会触发重置,而
.Bind(out _collection,resetThreshold:int.MaxValue)
将确保不使用重置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。