[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

그룹핑

ListViewItem 그룹핑 할 수 있습니다.

먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다.

1:            <!-- Group CheckBox -->  
2:            <CheckBox Grid.Column="0"   
3:                 Grid.Row="0"   
4:                 Checked="AddGrouping"   
5:                 Unchecked="RemoveGrouping">Group by Name</CheckBox>  

그룹 스타일 선언

GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다.

1:              <!-- Group Style -->  
2:              <ListView.GroupStyle>  
3:                <GroupStyle>  
4:                  <GroupStyle.ContainerStyle>  
5:                    <Style TargetType="{x:Type GroupItem}">  
6:                      <Setter Property="Margin" Value="0,0,0,5" />  
7:                      <Setter Property="Template">  
8:                        <Setter.Value>  
9:                          <ControlTemplate TargetType="{x:Type GroupItem}">  
10:                            <Expander IsExpanded="True" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">  
11:                              <Expander.Header>  
12:                                <DockPanel>  
13:                                  <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="Auto" />  
14:                                  <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount, StringFormat=' ({0})'}" />  
15:                                </DockPanel>  
16:                              </Expander.Header>  
17:                              <Expander.Content>  
18:                                <ItemsPresenter />  
19:                              </Expander.Content>  
20:                            </Expander>  
21:                          </ControlTemplate>  
22:                        </Setter.Value>  
23:                      </Setter>  
24:                    </Style>  
25:                  </GroupStyle.ContainerStyle>  
26:                </GroupStyle>  
27:              </ListView.GroupStyle>  

그룹 추가

PropertyGroupDescription 클래스를 생성할 때 그룹핑 하려는 속성을 매개변수로 전달하여  GroupDescriptions 컬렉션에 추가 해 줍니다.

1:      private void AddGrouping(object sender, RoutedEventArgs e)  
2:      {  
3:        CollectionView viewSource = (CollectionView)CollectionViewSource.GetDefaultView(ListView.ItemsSource);  
4:        // view 그룹화 지원 여부  
5:        if (viewSource.CanGroup)  
6:        {  
7:          PropertyGroupDescription description = new PropertyGroupDescription("ApartName");  
8:          viewSource.GroupDescriptions.Add(description);  
9:        }  
10:      }  

그룹 제거

GroupDescription 컬렉션의 요소를 모두 제거 해 줍니다.

1:      private void RemoveGrouping(object sender, RoutedEventArgs e)  
2:      {  
3:        CollectionView viewSource = (CollectionView)CollectionViewSource.GetDefaultView(ListView.ItemsSource);  
4:        viewSource.GroupDescriptions.Clear();  
5:      }  

그룹 데이터 변환

그룹 아이템의 총 거래 금액을 헤더에 표현하려 합니다. IValueConverter를 상속하는 GroupTradeMoneyConveter 클래스를 구현해 보겠습니다.

1:    public class GroupTradeMoneyConverter : IValueConverter  
2:    {  
3:      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)  
4:      {  
5:        if (value == null) return null;  
6:        ReadOnlyObservableCollection<object> items = value as ReadOnlyObservableCollection<object>;  
7:        if (items == null) return null;  
8:        long total = items.Sum(i => long.Parse(((TradeApt)i).TradeMoney, NumberStyles.Currency));  
9:        return total;  
10:      }  
11:      public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)  
12:      {  
13:        throw new NotImplementedException();  
14:      }  
15:    }  

Resource 지정

1:    <Window.Resources>  
2:      <local:GroupTradeMoneyConverter x:Key="GroupTradeMoneyConverter" />  
3:    </Window.Resources>  

DockPanel에 Item 추가

그룹 아이템의 거래 금액의 총합을 표시할 TextBlock 컨트롤을 추가 하고 Binding 속성에 Converter를 지정 합니다.

1:                          <ControlTemplate TargetType="{x:Type GroupItem}">  
2:                            <Expander IsExpanded="True" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">  
3:                              <Expander.Header>  
4:                                <DockPanel>  
5:                                  <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="Auto" />  
6:                                  <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount, StringFormat=' ({0})'}" />  
7:                                  <TextBlock Text="{Binding Path=Items, Converter={StaticResource GroupTradeMoneyConverter}, StringFormat=' {0:N0}'}" />  
8:                                </DockPanel>  
9:                              </Expander.Header>  
10:                              <Expander.Content>  
11:                                <ItemsPresenter />  
12:                              </Expander.Content>  
13:                            </Expander>  
14:                          </ControlTemplate>  

결과 화면













































댓글

  1. 안녕하세요.
    WPF 초보자 인데 설명한 자료의 소스를 오픈할 수 있나요?
    많은 도움이 될 것 같습니다.
    감사합니다.

    답글삭제
    답글
    1. 안녕하세요 wpf 바인딩 공부중인데 저도 혹시 소스를 받아볼수있을까요?
      게시글은 잘봤습니다!!

      삭제

댓글 쓰기

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행