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)
재설정이 사용되지 않도록합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다