gpt4 book ai didi

c# - 有没有更好的方法可以在不使用 ObservableCollection 的情况下加载列表?

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:12 25 4
gpt4 key购买 nike

我们使用 Telerik 的 RadGridView 来显示数据,绑定(bind)到业务对象列表。大多数数据都是这样加载的

    [DetailList] // like 20+ lists like this
public List<BusinessObject> BusinessObjects { get; } = new List<BusinessObject>();

private void FillDetail(ObjectContainingLotsOfInfo object)
{
try
{
this.BusinessObjects.AddRange(object.BusinessObjects.Linq);
// Where Linq is some sort of filter or SelectMany statement.

this.RefreshLists();
}
catch (Exception exception)
{
Trace.WriteLine(exception);
this.ErrorMessage = exception.Message;exception.Message));
}
}

private void RefreshLists()
{
var properties = this.GetType().GetProperties().Where(prop => prop.IsDefined(typeof(DetailList), false));

foreach (PropertyInfo item in properties)
{
Trace.WriteLine($"Refreshing the DetailList.{item.Name} property for {this.Identifier}");
this.RaisePropertyChanged(item.Name);
}
}

应用程序从一开始就使用异步,一旦从任务中的检索器加载数据,就会调用 fill 方法。但是,用户可以在数据从 API 返回之前导航到网格所在的位置(使用 UI 线程)。如果 GridView 在调用填充数据方法之前初始化,则网格将永远为空。如果调用填充数据,则网格加载就可以了。现在,我将所有列表制作成 ObservableCollections,并引用 Microsoft.Practices.Prism 以使用它对 AddRange 的定义,即使在加载数据之前我进入网格,一切都运行良好。但是一旦数据载入,我们就不会以任何方式更改它,不会添加或删除行,并且使用这么多 ObservableCollections 会影响性能。有一个更好的方法吗?有没有办法让 RaisePropertyChanged 在加载数据时完成它的工作?

编辑下面给出DetailList的定义

public class DetailListAttribute: Attribute
{
}

最佳答案

假设您有一个 List<POCO>属性名为 Foo .在其中实现常规的 INPC 内容。像往常一样将它绑定(bind)到一些ItemsSource某处。当异步方法完成获取数据时,分配一个 List<POCO>Foo :

Foo = pocoFromWherever.ToList();

Foo二传手提高 PropertyChanged .你没事。您也可以从另一个线程执行此操作,而不必调用 UI 线程。

我建议使用 ReadOnlyCollection<POCO> 而不是 List<POCO> , 以防止对集合只能替换而不能修改这一事实的任何潜在误解。

Foo = new ReadOnlyCollection<POCO>(pocoFromWherever.ToList());

我多年来一直在 WPF 中使用该模式来处理此类事情。不需要变聪明。

根据需要,您可能还想将 setter 设为私有(private)。

关于c# - 有没有更好的方法可以在不使用 ObservableCollection 的情况下加载列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44849349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com