2016-09-14 83 views
0

你好傢伙我是新來的stackoverflow,對我的文章中的錯誤感到抱歉。XAML和C異步數據綁定#

我的問題: 我綁定一個dataviewitemsControl當數據加載(實際綁定)UI凍結。數據太大,超過600行,我希望我的數據能夠一個接一個地或全部一起綁定,但順利。

我實施了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將騰出你的用戶界面,而數據是加載,但不能同時它結合

數據太大,超過600行,我希望我的數據一個接一個地或一個接一個地順利綁定。

只有一種方法可以做到這一點:virtualization

+0

謝謝斯蒂芬我已經做到了,但仍然沒有希望。有沒有其他的方法。我的標記代碼 –

+0

... –

+1

@MuhammadShakeel:歡迎來到stackoverflow。請勿將多行代碼片段發佈到評論中。改爲編輯你的問題。 – Liero

0

如果你的問題真的是數據綁定到太多的行,UI虛擬化將工作。

這是驗證它的最簡單方法:用ListBox替換ScrollViewer和ItemsControl。

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

ListBox默認打開UI虛擬化。不要忘記將高度設置爲固定值,就目前而言。

如果這有幫助,那麼問題就是DataBinding中的行數太多。檢查這個answer to question "Virtualizing an ItemsControl?"使它與ItemsControl一起工作。

如果這沒有幫助,那麼問題是在別的地方,我們需要找出答案。


PS:爲了使UI虛擬化工作,VirtualizingStackPanel必須是VisualTree中的ScrollViewer的子代。你的VisualTree看起來是這樣的:

ScrollViewer 
    ItemsControl 
     StackPanel (Defined by ItemsControl.ItemsPanel) 

您需要將其更改爲:

ItemsControl 
    ScrollViewer 
      VirtualizingStackPanel (Defined by ItemsControl.ItemsPanel) 

您可以通過修改ItemsControl.Template到包括ScrollViewer中,並通過改變ItemsPanelTemplate到VirtualizingStackPanel願意這樣做。請參閱鏈接above。在Visual Studio中探索VisualTree也有很好的工具,叫做Live Visual Tree

+0

它工作正常與虛擬化的數據是VirtualizationStackPanel的過程中的列表框。但問題是我的數據模板。我需要VirtualizeWrapPanel而不是VirtualizationStackPanel。代碼太大而無法在此處顯示,因此請從Google Drive下載Download ============================ ================================================== =================================== HTTPS://drive.google.com/drive/folders/0B8OB -A4gGzqNME9VLWYwMFdNRVk?usp = sharing –

+0

首先,區分'DataTemplate'和'ItemsPanelTemplate'。您將'DataTemplate'設置爲'ItemsControl.ItemTemplate'屬性來定義單個項目的內容,並且您將'ItemsPanelTemplate'設置爲'ItemsControl.ItemTemplate'屬性來定義所有屬性的佈局。其次,WPF不包含開箱即用的VirtualizingWrapPanel,但您可以谷歌一些社區庫。有時它也稱爲VirtualizingTilePanel。只需將其設置爲'ListBox.ItemsPanel - > ItemsPanelTemplate - > VirtualizingWrapPanel resp VirtualizingTilePanel'。 – Liero