윈도우8 & WP Tip

DataTemplateSelector와 StyleSelector 사용하기 Linus 평점: 없음 조회: 3037

원문 : http://ryunad.tistory.com/117

 

안녕하세요.

라이너스입니다.

오늘의 포스팅 내용은 DataTemplateSelectorStyleSelector입니다.

1.What is

DataTemplateSelector 혹은 StyleSelector(이하 Selector)는 ItemsControl을 상속받은 컨트롤이 요소(아이템)을 생성할 때 특정한 조건에 따라 DataTemplate 또는 Style을 변경할 수 있습니다.

WPFSilverlight5ImplicitDataTemplate과 비슷하다고 생각하시면 됩니다. 다만 ImplicitDataTemplate은 데이터의 타입을 보고 템플릿을 정하지만 Selector는 개발자가 정한 규칙에 따라 템플릿을 정한 다는 점에서 더 활용도가 높다고 말씀드릴 수 있습니다.

 

2.How to

그럼 간단하게 DataTemplateSelector를 이용해서 특정 조건에 따라 템플릿을 갈아입는 ListView를 만들어보도록 하겠습니다.

 

- Model 정의

class SampleItem

    {

        public bool IsAlternate { get; set; }

        public string Text { get; set; }

 

    }

 

간단하게 Model을 하나 정의하고 bool 타입과 string 타입의 속성을 정의하였습니다.

IsAlternate속성은 어떤 템플릿을 사용할 것인지 Selector의 조건으로 사용할 변수입니다.

 

사실 DataTemplateSelectorStyleSelector는 구현방법도 똑같고 큰 차이가 없습니다.

다만 차이가 있다면 반환하는 형식이 Style이냐 DataTemplate이냐의 차이만을 가질 뿐입니다.

어떤 것을 사용하셔도 되니 그때그때 상황에 따라 맞는 Selector를 구현하시면 됩니다.

저는 여기서 DataTemplateSelector를 구현하도록 하겠습니다.

 

- Selector 구현

public class AlternateDataTemplateSelector : DataTemplateSelector

    {

        public DataTemplate OriginDataTemplate { get; set; }

        public DataTemplate AlternateDataTemplate { get; set; }

 

        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)

        {

            var sampleItem = item as SampleItem;

 

            if (sampleItem.IsAlternate == true)

                return AlternateDataTemplate;

            else

                return OriginDataTemplate;

        }

    }

 

Selector를 상속받으면 SelectTemplateCore라는 함수를 오버라이드 할 수 있습니다.

ItemsControlSelector를 설정한 상태에서 요소를 만들기 시작하면 요소 하나당 SelectTemplateCore함수를 한번씩 들어오게 되어있습니다.

이 메서드에서 개발자가 정한 규칙에 따라 아이템에 필요한 템플릿이나 스타일을 지정할 수 있습니다.

이제 구현이 끝났으니 설정해서 사용하면 됩니다.

 

- 사용하기

<Page

    x:Class="App2.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="using:App2"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:toolkit="using:WinRTXamlToolkit.Controls"

    mc:Ignorable="d">

    <Page.Resources>

        <DataTemplate x:Key="OriginDataTemplate">

            <Grid Width="240" Height="75">

                <TextBlock Text="{Binding Text}" />

            </Grid>

        </DataTemplate>

 

        <DataTemplate x:Key="AlternateDataTemplate">

            <Grid Width="240" Height="75" Background="Blue">

                <TextBlock Text="{Binding Text}" />

            </Grid>

        </DataTemplate>

 

        <local:AlternateDataTemplateSelector x:Key="AlternateDataTemplateSelector"

                          OriginDataTemplate="{StaticResource OriginDataTemplate}"

                          AlternateDataTemplate="{StaticResource AlternateDataTemplate}"/>

 

    </Page.Resources>

 

    <Grid x:Name="LayoutRoot">

        <ListView x:Name="SampleListView"

                  ItemTemplateSelector="{StaticResource AlternateDataTemplateSelector}"/>

    </Grid>

</Page>

ListView에 ItemTemplateSelector 속성에 리소스로 등록한 DataTemplateSelector를 등록했습니다.

DataTemplateSelector에는 조건에 따라 바꿔줄 DataTemplate을 등록을 하는 것에 주의해서 봐주세요.

만약 StyleSelector를 사용하신다면 ItemContainerStyleSelector속성에 설정하시면 됩니다.

 

자~ 결과화면입니다.

 

 

Selector를 이용하면 개발자가 복잡한 구현을 하지 않고도 이렇게 특정 조건에 따른 템플릿이나 스타일을 쉽게 입힐 수 있습니다.

오늘의 포스팅은 여기까지 입니다.

 

추가로 더 궁금한 사항이나 코드요청은 제 블로그를 통해 해주세요.

감사합니다.

태그 : 사용하기 DataTemplateSelector와 StyleSelector
작성자 정보
Linus
Level 61
 [EXP.21/250]

메일:  비공개

글등록 +12 1920 덧글등록 +3 1260
자기소개
글 공유하기 |
  tweet facebook
2012-09-10 오후 7:31:32
나도한마디
글리스트
Windows 스토어 앱 개발 가이드 msdn with C#  sky
[windows 8 RT] Tcp Socket Echo Client 파일첨부 Fool
[windows 8 RT] MVVM, Command & Event Aggregation[2] 파일첨부 Fool
[windows 8 RT] Reversi RT 개발 후기 파일첨부 Fool
[windows 8 RT] Wokka Anim 파일첨부 Fool
XP에서 WP7 개발하기...  착한형
HTML 문자열 디코딩하기[1]  Linus
 ★현재글->   DataTemplateSelector와 StyleSelector 사용하기  Linus
[Windows 8] 웹 컨텐츠를 IRandomAccessStream으로 저장하기.   Linus
Windows 8에서 Live SSO 인증하기[1]  Linus
[Window 8] 스터디 4주차 자료입니다.[9]+2  귤신
FlowDirection과 다국어 작업[2]  재선
[Window 8] 스터디 3주차 자료입니다.[3]  귤신
[windows 8] 'blend'를 이용하여 Orientation 이해하기.[3]  dely
윈도우8 앱스토어 등록절차[5]+3  HOONS
[Window 8] 스터디 2주차 자료입니다.[5]+1  귤신
[팁] 맥부트캠프 Windows8 Release Preview & visual studio12 멈춤해결[3] 파일첨부 포민
[팁] Windows 8 Release Preview 설치 VirtualBox vs. Virtual Machine...[2]+1  Boms