Команда, у меня немного сложная структура данных, здесь более подробное описание . Когда я нажимаю, чтобы развернуть элементы, даже если я использовал await / asyn c, пользовательский интерфейс не показывает мне расширяющиеся элементы, но остается в режиме ожидания, пока не будут созданы все листья. На очень больших подструктурах я ожидал бы, что он откроется и увидит элементы, которые будут добавлены постепенно.
Я сомневаюсь, какое поведение более подходящее: 1) отображение листов при показе здания открывает к проблемам, если использует щелчки вокруг, пока дерево все еще строится. Так что я не уверен, что мне это нравится. 2) поскольку процесс может занять некоторое время, я хотел бы показать что-то вроде «загрузки» или соответствующую визуальную обратную связь для происходящего. Но не знаю, как это сделать.
Что бы вы порекомендовали?
Дополнительная информация: В проекте есть пациенты и посещения под каждого пациента. Структура полностью динамична c, поэтому количество уровней под пациентом не может быть известно заранее, так как каждое посещение может иметь дополнительные посещения и документы, связанные с посещением.
Количество пациентов может быть чрезвычайно большим ( 10K +). Первая проблема с производительностью, с которой я столкнулся, заключалась в том, что загрузка всех пациентов и всех посещений за один прием потребует слишком много времени (> 1 минуты!), Поэтому после нескольких указаний я принял подход, при котором загружаются только пациенты, а пустой лист создается, если пациент посещает. Когда пациент расширяется, все листья для пациента загружаются. Глубина и структура полностью меняется от пациента к пациенту. Таким образом, есть некоторые, которые очень быстро загружаются (1 уровень или всего несколько посещений), а некоторые требуют до 1 или более секунд, поскольку они могут иметь более 50 посещений на 5 или более уровнях.
Как я m с использованием SQLServer Express Я проверил, и нет НИКАКОГО значимого влияния запросов на извлечение данных из БД, поскольку они составляют около миллисекунд.
Соединение с БД осуществляется через EFCore, а конечные элементы загружается через LINQ с ожидаемым ToListAsyn c в рекурсивном режиме: пациент загружает связанные с ним листья. Когда лист загружается, он будет смотреть и загружать вложенные листья ... подчиненные листья будут вести себя одинаково.
Так что я бы НЕ ожидал каких-либо задержек в пользовательском интерфейсе.
Здесь код загрузить листы на пациентов, которые уже посещены и НЕ загружены
private async void treeView_Expanding(WinUI.TreeView sender, WinUI.TreeViewExpandingEventArgs args)
{
if (args.Item is MTreeViewPaz)
{
if ((((MTreeViewPaz)args.Item).VisitsN > 0) && (((MTreeViewPaz)args.Item).Loaded == LoadingStatus.NotStarted))
{
await ((MTreeViewPaz)args.Item).LoadDataAsync();
}
}
}
В листах применяется точно такой же лог c:
public async Task LoadDataAsync()
{
Loaded = LoadingStatus.Loading;
var aList = App.gDataContext.Cache.VVisitHierarchy
.Where(a => a.CodPaz == _PazV.CodPaz && a.Parent == null)
.OrderBy(b => b.CreationOrd).ThenBy(b => b.Data).ThenBy(b => b.CodPar)
.ToList();
foreach (var item in aList)
{
if (item.Visits > 0)
{
MTreeViewVisit aMVisit = new MTreeViewVisit(item);
Visits.Add(aMVisit);
if (item.Visits > 0)
{
await aMVisit.LoadDataAsync();
}
}
}
Visits.RemoveAt(0);
Loaded = LoadingStatus.Loaded;
}