2016-09-14 5 views
0

こんにちは、私はstackoverflowに新しいです、私の記事の間違いを申し訳ありません。XAMLとC#の非同期データバインディング

私の質問:データのロードがUIフリーズを(実際に結合)するとき は私がitemsControldataviewを結合しています。データが大きすぎ、600行以上の場合は、データを1つずつまたはすべて同時にバインドしたいが、スムーズにバインドしたい。

Nito Async.EXライブラリを実装しましたが、機能しませんでした。

private INotifyTaskCompletion<DataView> _studentlist; 
Public INotifyTaskCompletion<DataView> StudentList 
{ 
    get { return _studentlist; } 
    set { SetProperty(ref _studentlist, value); } 

} 
private async Task Fill() 
{ 
    StudentList = NotifyTaskCompletion.Create(GetData()); 
} 

private async Task<DataView> GetData() 
{ 
    Loading = true; 
    await Task.Delay(100); 

    DataTable StudentListTable = await DbContext.QueryT(SelectQuery); 

    DataColumn DC = new DataColumn("DELETE", typeof(bool)); 
    DC.DefaultValue = false; 
    StudentListTable.Columns.Add(DC); 

    Loading = false; 
    return StudentListTable.DefaultView; 
} 


参考文献:
Prism for MVVM
Unity for prism
Nito Async.EX
Mahapps.Metro
Material Design Xaml toolkit

任意の助けいただければ幸いです。それはを結合だ時にデータがロードではなく、一方で

答えて

0

NotifyTaskCompletionはあなたのUIを解放します。

データが大きすぎ、600行を超えると、データを1つずつまたはすべて同時にバインドしたいが、スムーズにバインドしたい。

これを行う方法は1つだけです:virtualization

+0

ありがとうスティーブン私は既にそれをしましたが、まだ絶望的です。それ以外の方法はありますか?私のマークアップコード –

+0

... –

+1

@MuhammadShakeel:ようこそstackoverflow。コメントに複数行のコードスニペットを投稿しないでください。代わりに質問を編集してください。 – Liero

0

実際に問題が多すぎる行にデータバインディングされている場合は、UI仮想化が機能します。

これが最も簡単な方法です。ScrollViewerとItemsControlをListBoxに置き換えます。

<ListBox ItemsSource="{Binding StudentList.Result}" Height="500" /> 

ListBoxにはデフォルトでUI仮想化が有効になっています。ちょうど今のところ固定値に高さを設定することを忘れないでください。

この問題が解決するのであれば、問題は実際には多すぎる行へのデータバインディングにあります。 answer to question "Virtualizing an ItemsControl?"にチェックを入れ、ItemsControlと連携させる。

これで問題が解決しない場合は、問題は別の場所にあるため、われわれは見つ​​け出す必要があります。


PS:動作するようにUIの仮想化を行うためには、VirtualizingStackPanelはVisualTreeにScrollViewerの直接の子でなければなりません。

ScrollViewer 
    ItemsControl 
     StackPanel (Defined by ItemsControl.ItemsPanel) 

あなたはそれを変更する必要があります:

ItemsControl 
    ScrollViewer 
      VirtualizingStackPanel (Defined by ItemsControl.ItemsPanel) 

あなたはScrollViewerのを含めるようにItemsControl.Templateを変更することによって、およびVirtualizingStackPanelにItemsPanelTemplateを変更することでそれを行うことができますあなたのVisualTreeは次のようになります。リンクaboveを参照してください。Visual StudioでVisualTreeを探検する素晴らしいツールもあります。Live Visual Tree

+0

リストボックスでは正常に動作し、データはVirtualizationStackPanelの仮想化されています。しかし、問題は私のデータテンプレートです。 VirtualizationStackPanelの代わりにVirtualizeWrapPanelが必要です。コードが大きすぎてGoogleドライブからダウンロードしてください。Download ====================== ========================================== ===================== https://drive.google.com/drive/folders/0B8OB -A4gGzqNME9VLWYwMFdNRVk?usp = sharing –

+0

まず、 'DataTemplate'と' ItemsPanelTemplate'を区別します。 'DataTemplate'を' ItemsControl.ItemTemplate'プロパティに設定して単一項目の内容を定義し、 'ItemsPanelTemplate'を' ItemsControl.ItemTemplate'プロパティに設定してすべてのプロパティのレイアウトを定義します。次に、WPFにはVirtualizingWrapPanelは含まれていませんが、Googleではいくつかのコミュニティライブラリを使用できます。 VirtualizingTilePanelと呼ばれることもあります。 'ListBox.ItemsPanel - > ItemsPanelTemplate - > VirtualizingWrapPanel resp VirtualTilePanel'に設定するだけです。 – Liero