2016-09-14 1 views
0

안녕하세요 여러분, 내 게시물의 실수로 인해 유감스럽게 stackoverflow에 새로 왔습니다. XAML 및 C#의 비동기 데이터 바인딩

내 질문

: 은 내가 dataview itemsControl에 바인딩하고 때 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은 UI를 확보 것이다, 그러나 바인딩 아니에요있다.

데이터가 너무 많고 600 행 이상입니다. 데이터를 한 번에 하나씩 또는 모두 한 번에 원활하게 묶기를 원합니다.

이렇게하는 방법은 하나만 있습니다 : virtualization.

+0

감사합니다. Stephen 저는 이미 그렇게했지만 여전히 희망이 없습니다. 다른 방법이 있나. 해당 마크 업 코드 –

+0

... –

+1

@MuhammadShakeel : 오신 것을 환영합니다 stackoverflow. 주석에 여러 줄 코드 조각을 게시하지 마십시오. 대신 질문을 편집하십시오. – Liero

0

문제가 실제로 너무 많은 행에 데이터 바인딩되면 UI 가상화가 작동합니다.

확인하는 가장 쉬운 방법은 입니다. ScrollViewer와 ItemsControl을 ListBox로 바꿉니다.

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은 일부 커뮤니티 라이브러리를 Google에 포함 할 수 있습니다. 때로는 VirtualizingTilePanel이라고도합니다. 그냥 ListBox.ItemsPanel -> ItemsPanelTemplate -> VirtualizingWrapPanel resp VirtualizingTilePanel'으로 설정하십시오. – Liero