2017-06-30 11 views
2

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 
{ 
} 
+0

Reactive Extensions(https://msdn.microsoft.com/en-us/library/hh242985(v=vs.103).aspx)を使用しましたか?データが使用可能になると一度更新されて完了するIObservableをセットアップできます。 – Necoras

+2

'List Foo {/ * INPC stuff * /}'というプロパティがあれば、データを取得するときに 'Foo = pocoClasses.ToList();'を代入します。既存の 'List 'を補充しないでください。プロパティに新しいものを割り当てます。セッターが 'PropertyChanged'を発生させます。完了しました。 –

+0

@EdPlunkettリストのセッターを実装することをお勧めしますか? – kleineg

答えて

1

以下の通りです。それに従来のINPCのものを実装します。どこかでItemsSourceに通常通りバインドしてください。非同期メソッドは、データを取得し終えると、割り当て新しいList<POCO>Fooへ:

Foo = pocoFromWherever.ToList(); 

FooセッターはPropertyChangedを発生させます。大丈夫だよ。これは、UIスレッドを呼び出すことなく、別のスレッドから行うこともできます。

List<POCO>の代わりにReadOnlyCollection<POCO>を使用することをお勧めします。これは、コレクションの交換のみ可能で修正されていないという誤解を防ぐためです。

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

私はこのタイプのものをWPFで数年間使用してきました。賢くなる必要はありません。

要件に応じて、セッターをプライベートにすることもできます。

+0

私はReadOnlyCollectionを使用することができませんでした。なぜなら、そのタブが閉じられていればデータを処分するからです。 – kleineg

+0

ReadOnlyCollectionはどのように問題になりますか? –

+0

ReadOnlyCollectionを使用して実装したとき、コレクションを修正できないというクリアメソッドが呼び出されたときに例外がスローされました。 – kleineg

関連する問題