2016-12-12 13 views
0

Xamarin Project의 일부로 Windows 8, Android 및 iOS에 사용되는 ViewModel이 있습니다. 이제 WPF의 ListView에 해당 VM을 표시해야합니다.WPF - 그룹화 된 데이터가 이미있는 CollectionViewSource 사용

그 VM은 이미 그룹화 된 데이터를 ObservableCollection<GroupedResult<string, SearchResult>>으로 노출합니다. GroupResult는 Key (문자열) 속성과 윈도우 8의 ListView과는 IEnumerable Source 특성

나는 CollectionViewSource (CVS)에 데이터를 할당 할 수 있으며, CVS에게 항목 속성 PropertyPath("Source")의 경로를 말씀을 가지고 있으며, 그것을 잘 작동합니다.

그러나 WPF는 CVS에 그룹화되지 않은 목록을 제공하여 모든 그룹을 그룹화 할 수 있습니다. VM에 이미 그룹화 된 데이터가 포함되어 있음을 WPF CVS에 알려면 어떻게합니까?

답변

0

WPF의 System.Windows.Data.CollectionViewSource 클래스에는 IsSourceGrouped 또는 이에 상응하는 속성이 없으므로 데이터가 이미 그룹화되었음을 실제로 알 수 없습니다.

기본적으로 두 가지 옵션이 있습니다. 소스 컬렉션을 그룹 해제

  1. 및 그룹이 해제 된 컬렉션에 CollectionViewSource의 Source 속성을 설정하고 평소와 같이 그 GroupDescriptions의 컬렉션에 PropertyGroupDescription을 추가 그룹화 된 컬렉션에 https://msdn.microsoft.com/en-us/library/ms742542(v=vs.110).aspx

  2. 설정 자료와 정의 ItemTemplate을 그룹화 개체 :

    public MainWindow() 
    { 
        InitializeComponent(); 
        List<User> items = new List<User>(); 
        items.Add(new User() { Name = "John Doe", Age = 42, Sex = SexType.Male }); 
        items.Add(new User() { Name = "Jane Doe", Age = 39, Sex = SexType.Female }); 
        items.Add(new User() { Name = "Sammy Doe", Age = 13, Sex = SexType.Male }); 
    
        var result = 
         from x in items 
         group x by x.Sex into g 
         orderby g.Key 
         select g; 
    
        listBox.ItemsSource = result; 
    } 
    

<ListBox x:Name="listBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Expander Header="{Binding Key}"> 
        <ListBox ItemsSource="{Binding}"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <TextBlock Text="{Binding Name}"/> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
       </Expander> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
+0

원본이 그룹화되어 있고 템플릿을 그룹화 한 것으로 가정합니다. ListBox가 아닌 ListView에 표시 할 것입니다. 섹션이 항상 확장되도록하려면 비어 있지 않은 경우 Expander가 아닌 컨테이너를 제안 할 수 있습니까? –

+0

확장기의 문제점은 무엇입니까? IsExpanded를 true로 설정하면 기본적으로 확장됩니다. 그룹을 확장/축소 할 수 없도록하려면 확장기를 제거하고 ListBox 또는 ItemsControl을 DataTemplate의 루트 패널로 사용하면됩니다. – mm8

+0

GroupStyle을 모방하려고합니다. HidesIfEmpty = "True"저는 Win8에서 그렇게 성공적으로 사용했습니다. 당신이 제안한대로 확장기를 다른 곳으로 바꿀 것입니다. 고마워요 –