TelerikのRadGridViewを使用してデータを表示し、ビジネスオブジェクトのリストにバインドします。データのほとんどは、アプリケーションが最初から非同期を使用し、データはタスクでレトリーバーからロードされると、fillメソッドが呼び出されるようにObservableCollectionを使用せずにリストをロードするより良い方法はありますか?
[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);
}
}
としてロードされます。ただし、ユーザーは、データがAPIから返ってくる前に、グリッドが配置されている場所(UIスレッドを使用して)に移動できます。 fillデータメソッドが呼び出される前にグリッドが初期化されると、グリッドは永久に空のままです。データを入力するとグリッドが呼び出され、それが正常にロードされます。今度はObservableCollectionsにすべてのリストを作成し、Microsoft.Practices.Prismを参照してAddRangeの定義を使用しました。データがロードされる前にグリッドに移動してもすべて正常に機能しました。しかし、いったんデータがロードされると、私たちはそれを何も変更せず、行の追加や削除もなく、非常に多くのObservableCollectionsを使用するとパフォーマンスが低下します。これを行うより良い方法はありますか? RaisePropertyChangedをデータ読み込み時の仕事にする方法はありますか?
編集 はDetailListの定義は、あなたがFoo
という名前List<POCO>
性質を持っているとしましょう
public class DetailListAttribute: Attribute
{
}
Reactive Extensions(https://msdn.microsoft.com/en-us/library/hh242985(v=vs.103).aspx)を使用しましたか?データが使用可能になると一度更新されて完了するIObservableをセットアップできます。 – Necoras
'List Foo {/ * INPC stuff * /}'というプロパティがあれば、データを取得するときに 'Foo = pocoClasses.ToList();'を代入します。既存の 'List 'を補充しないでください。プロパティに新しいものを割り当てます。セッターが 'PropertyChanged'を発生させます。完了しました。 –
@EdPlunkettリストのセッターを実装することをお勧めしますか? – kleineg