본문 바로가기

C#의 속삭임

[C#][WPF]데이터 바인딩


* 데이터 바인딩은 크게 두가지로 구분한다.

** 소스 : 데이터를 의미한다.

** 타깃 : 컨트롤을 의미한다.

* StaticResource와 DynamicResource같이 Binding은 마크업 확장이다.




* xmlns에서 간단한 바인딩 예제 형태

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

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

<!-- 소스1-->

    <ScrollBar Name="scroll"

               Orientation="Horizontal"

               Margin="24"

               Maximum="100" LargeChange="10" SmallChange="1"/>

<!-- 타깃1-->

    <Label HorizontalAlignment="Center"

           Content="{Binding ElementName=scroll, Path=Value}"/>

<!-- 소스2-->

    <ScrollBar Name="scroll2"

               Orientation="Horizontal"

               Margin="24"

               Maximum="100" LargeChange="10" SmallChange="1"/>

<!-- 타깃2-->

    <Label HorizontalAlignment="Center">

        <Label.Content>

            <Binding ElementName="scroll2" Path="Value"/>

        </Label.Content>

    </Label>

</StackPanel>


* 엄밀하게 말하면 바인딩의 정의문 즉, {}안에 문장은 마크업 언어가 아님으로 ""를 붙일수가 없다. 하지만 타깃2처럼 한다면 가능하다. 꼭 "을 붙일거라면 타깃2처럼 사용하면 된다.

Label.Content는 생략될수 없다. 왜냐면 타깃은 DependencyProperty여야 한다. 즉, 바인딩은 반드시 의존프로퍼티의 지원을 받는 프로퍼티에서 수립되어야 하며, 컨트롤과 엘리먼트는 그 의존 프로퍼티의 변화에 반응하게 설계되어 있기 때문이다.




* Binding Mode 

** 사용법 

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWay }"

** 종류

OneWay 

 소스의 변화를 타킷에 적용한다.

TwoWay

 소스와 타깃의 변화를 양방향으로 적용한다. 

OneTime

 타깃이 소스로부터 초기화 되지만, 한번만 초기에 반영된다. 

OneWayToSource

 타깃의 변화가 소스에 적용된다. 기본적인 형태의 반대되는 형태다. 

** 기본 모드 : 기본 모드에서는 바인딩이 정의되어 있는 곳의 프로퍼티에 의해 제어 된다.





* DataContext 

** 소스를 명시한다.

** 트리구조로 상속된다.

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

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

            DataContext="{Binding ElementName=scroll}">

    <!--바인딩 소스-->    

    <ScrollBar Name="scroll"

               Orientation="Horizontal"

               Margin="24"

               Maximum="100" LargeChange="10" SmallChange="1"/>

    <Label HorizontalAlignment="Center"

           Content="{Binding  Path=Value, Mode=OneWay}"/>


    <!--바인딩 타깃-->

    <Button HorizontalAlignment="Center" Margin="24"

           FontSize="{Binding  Path=Value, Mode=OneWay}">

        Button Font

    </Button>

</StackPanel>






* Path는 꼭 Property일 필요는 없다.

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

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

      xmlns:s="clr-namespace:System;assembly=mscorlib"

      FontSize="12pt"

      Name="page">

    <StackPanel>

        <TextBlock HorizontalAlignment="Center">

            First element in StackPanel

        </TextBlock>


        <ListBox HorizontalAlignment="Center"

                 Margin="24">

            <ListBoxItem>First ListBox Item</ListBoxItem>

            <ListBoxItem>Second ListBox Item</ListBoxItem>

            <ListBoxItem>Third ListBoxItem</ListBoxItem>

            <ListBoxItem>Fourth ListBox Item</ListBoxItem>

            <ListBoxItem>Fifth ListBoxItem</ListBoxItem>

        </ListBox>


        <TextBlock HorizontalAlignment="Center">

            <Label Content="Number of characters in third ListBox item = " />

            <Label Content="{Binding ElementName=page, 

                        Path=Content.Children[1].Items[2].Content.Length}" />

            <LineBreak />

            <Label Content="Number of characters in selected item = " />

            <Label Content="{Binding ElementName=page,

                        Path=Content.Children[1].SelectedItem.Content.Length}" />

        </TextBlock>

    </StackPanel>

</Page>













'C#의 속삭임' 카테고리의 다른 글

[C#][WPF] 클래스 계층도  (0) 2014.04.23
[C#][WPF] 첫시작.  (0) 2014.04.23
[C#][WPF][프레임워크][MVVM] MVVM Light  (0) 2014.04.17
[C#][패턴] MVVM  (0) 2014.04.16
[C#][AxWebBrowser] AxWebBrowser 컨트롤러  (0) 2014.04.08