From bf95f669a3a89f450bea77ab2af17aa83fea204e Mon Sep 17 00:00:00 2001 From: Loretta Date: Fri, 5 Jul 2024 15:39:14 +0200 Subject: [PATCH] imprvements, fixes, etc... --- .../Services/AcSignalRDataSource.cs | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs b/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs index 5c4457e..c6df6a2 100644 --- a/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs +++ b/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs @@ -119,6 +119,30 @@ namespace AyCode.Blazor.Components.Services public object SyncRoot => _syncRoot; public bool IsFixedSize => false; + public bool HasWorkingReferenceList { get; private set; } + + public void SetWorkingReferenceList(List workingList) + { + if (workingList == null!) return; //throw new ArgumentNullException(nameof(workingList)); + + Monitor.Enter(_syncRoot); + + try + { + HasWorkingReferenceList = true; + if (ReferenceEquals(InnerList, workingList)) return; + + if (workingList.Count == 0) workingList.AddRange(InnerList); + + Clear(true); + InnerList = workingList; + } + finally + { + Monitor.Exit(_syncRoot); + } + } + private object[]? GetContextParams() { var parameters = new List(); @@ -138,9 +162,9 @@ namespace AyCode.Blazor.Components.Services { if (SignalRCrudTags.GetAllMessageTag == AcSignalRTags.None) throw new ArgumentException($"SignalRCrudTags.GetAllMessageTag == SignalRTags.None"); - var resultList = (await SignalRClient.GetAllAsync>(SignalRCrudTags.GetAllMessageTag, GetContextParams())) ?? throw new NullReferenceException(); + var responseData = (await SignalRClient.GetAllAsync>(SignalRCrudTags.GetAllMessageTag, GetContextParams())) ?? throw new NullReferenceException(); - await LoadDataSource(resultList); + await LoadDataSource(responseData, false, false, clearChangeTracking); } public Task LoadDataSourceAsync(bool clearChangeTracking = true) @@ -152,28 +176,26 @@ namespace AyCode.Blazor.Components.Services if (result.Status != SignalResponseStatus.Success || result.ResponseData == null) throw new NullReferenceException($"LoadDataSourceAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}"); - return LoadDataSource(result.ResponseData); + return LoadDataSource(result.ResponseData, false, false, clearChangeTracking); }, GetContextParams()); } - public async Task LoadDataSource(IList fromSource, bool clearChangeTracking = true) + public async Task LoadDataSource(IList fromSource, bool refreshDataFromDbAsync = false, bool setSourceToWorkingReferenceList = false, bool clearChangeTracking = true) { Monitor.Enter(_syncRoot); try { - Clear(clearChangeTracking); + if (!ReferenceEquals(InnerList, fromSource)) + { + Clear(clearChangeTracking); - if (fromSource is List fromSourceCasted) InnerList = fromSourceCasted; - else InnerList.AddRange(fromSource); + if (setSourceToWorkingReferenceList && fromSource is List fromSourceList) SetWorkingReferenceList(fromSourceList); + else InnerList.AddRange(fromSource); + } + else if (clearChangeTracking) TrackingItems.Clear(); - //foreach (var item in fromSource) - //{ - // InnerList.Add(item); - - // var eventArgs = new ItemChangedEventArgs(item, TrackingState.GetAll); - // if (OnDataSourceItemChanged != null) await OnDataSourceItemChanged.Invoke(eventArgs); - //} + if (refreshDataFromDbAsync) LoadDataSourceAsync(false).Forget(); } finally {