WPF:如何实现两个TabItem间ICollectionViewLiveShaping实时排序?
解决WPF中ICollectionViewLiveShaping添加新项后不自动排序的问题
以下是针对性的修复步骤:
1. 验证排序属性匹配
检查SortDescription中的属性名与UscitaModelView的实际属性名完全一致。你的代码中使用"Data"作为排序字段,需确保UscitaModelView存在公共、可访问的Data属性,且类型为DateTime(或支持排序的日期类型)。
2. 确保模型实现属性变更通知
LiveSorting依赖属性变更事件触发重新排序,因此UscitaModelView必须实现INotifyPropertyChanged接口。如果使用CommunityToolkit.Mvvm,直接用[ObservableProperty]标记Data属性即可:
public partial class UscitaModelView : ObservableObject { [ObservableProperty] private DateTime _data; // 其他属性定义... }
3. 添加新项后手动触发视图刷新
若LiveSorting未自动生效,可在添加新项后手动调用Refresh()强制排序:
修改UsciteViewModel的AddUscita方法:
public void AddUscita(UscitaModel uscita) { if (uscita is not null) { _ocUscite.Add(new UscitaModelView(uscita)); Uscite?.Refresh(); } }
4. 确认LiveSorting配置完整性
调试时确认Uscite.IsLiveSorting的值为true,且LiveSortingProperties已正确添加"Data":
if (Uscite != null) { Uscite.LiveSortingProperties.Add("Data"); Uscite.IsLiveSorting = true; // 确认此处配置生效 Debug.Assert(Uscite.IsLiveSorting); }
5. 优化批量数据加载的排序逻辑
在LoadUscite批量添加数据时,可临时关闭LiveSorting提升性能,添加完成后恢复并刷新:
async void LoadUscite() { var uscitemodel = await _repoUscite.GetAllAsync(); if (uscitemodel is not null) { // 临时关闭LiveSorting Uscite?.IsLiveSorting = false; foreach (var uscita in uscitemodel) { _ocUscite.Add(new UscitaModelView(uscita)); } // 恢复排序并刷新 if (Uscite != null) { Uscite.IsLiveSorting = true; Uscite.Refresh(); } } }
内容的提问来源于stack exchange,提问作者Kraken
相关产品推荐
相关产品推荐

