oneway - 해당되는 글 1건
데이터 바인딩이란 컨트롤과 엘리먼트를 데이터에 연결시키는 기술이다. 이 정의가 약간 모호할 수있는데, 이것은 데이터 바인딩이 굉장히 넓은 범위와 다양한 기술을 포함하기 때문이다. 데이터 바인딩은  CheckBox 컨트롤을 불리언 변수에 연결하는 것처럼 간단할 수 있고 데이터베이스와 데이터 엔트리 패널을 연결하는 것처럼 복잡해 질 수도 있다.
컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 2가지 기능을 제공한다.
가장 간단한 바인딩은 2개의 컨트롤 사이에서 존재하는 것이다. 예를 들어 ScrollBar의 Value 프로퍼티를 보여주기 위한 Label 컨트롤을 생각해보자. 이 경우 Scrollbar의 ValueChanged 이벤트 핸들러를 연결하거나 다음의 스탠드얼론 XAML 파일과 같이 데이터 바인딩을 정의할 수 있다.

<Grid>

        <StackPanel VerticalAlignment="Center">

           <ScrollBar Name="scroll" Orientation="Horizontal"

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

            <Label HorizontalAlignment="Center"

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

        </StackPanel>

    </Grid>



<Grid>

        <StackPanel VerticalAlignment="Center">

            <ScrollBar Name="scroll" Orientation="Horizontal"

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

            <Label HorizontalAlignment="Center">

                <Label.Content>

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

                </Label.Content>

            </Label>

        </StackPanel>

    </Grid>

 

중괄호 내에 Binding 정의가 있으며, Binding 클래스의 프로퍼티 중 ElementName와 Path가 이 정의에 포함된다. 이 Binding 정의에서 ElementName은 ScrollBar의 Name속성에 부여된 이름인 scroll로 설정되고 Binding의 Path 프로퍼티는 Value로 설정되는데, 이 컨텍스트에서는 ScrollBar의 Value프로퍼티이다. 그 후 Label의 Content 프로퍼티는 ScrollBar의 Value프로퍼티와 바인딩되어 ScrollBar의 조작에 따라 값이 Label에 출력된다.



바인딩은 4가지의 모드를 가지고 있다.
OneWay, TwoWay, OneTime, OneWayTosource로 나열할 수 있다.

기본적인 형태는 아래와 같다. 

<Label HorizontalAlignment="Center"

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

 

또한 모드를 TwoWay로 설정할 수도 있다. 

<Label HorizontalAlignment="Center"

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

이 프로그램에서 TwoWay는 기능상 OneWay와 동일하지만 실제로는 Label의 Content 프로퍼티의 변화도 ScrollBar의 Value프로퍼티에 반영된다. 

<Label HorizontalAlignment="Center"

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

 OneTime의 경우 타깃이 소스로부터 초기화되지만 소스의 변화가 계속적으로 반영되지 않고 초기에 한번만 반영된다. 이 프로그래에서는 ScrollBar의 초기 Value가 0이기 때문에 Label이 0을 표시하며, 표시된 값은 ScrollBar의 변화에 더 이상 반응하지 않는다.

 

<Label HorizontalAlignment="Center"

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

 이것은 일반적으로 생각하는 소스와 타깃의 의미에 반대되게 타깃이 소스를 갱신하는 형태이다. 마치 과녁이 거꾸로 화살 쪽으로 날아와 과녁의 중심을 스스로 찌르는 듯한 형태라고 볼 수 있다. 따라서 타깃(Label)은 소스(ScrollBar)를 갱신해야 한다.

DataContext 프로퍼티가 상당히 유용할 때가 있는데, DataContext가 엘리먼트 트리를 통해 상속되기 때문에 하나의 엘리먼트에 DataContext를 사용해 바인딩을 설정하면 aems 자식 엘리먼트에도 동일하게 적용된다.

<Grid>

        <StackPanel VerticalAlignment="Center" 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}">Bound Button</Button>

        </StackPanel>

    </Grid>

DataContext StackPanel엘리먼트에서 한 번 설정되었고 Label Button ScrollBar와 바운딩됐다. Label에 바운딩된 프로퍼티는 Context이지만 Button에 바운딩된 프로퍼티는 FontSize이기 때문에 ScrollBar의 막대를 움직이면 Button 내부의 텍스트가 점점 커지고 이에 따라 Button 자체도 커지게 된다.







저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0
데이터 바인딩이란 컨트롤과 엘리먼트를 데이터에 연결시키는 기술이다. 이 정의가 약간 모호할 수있는데, 이것은 데이터 바인딩이 굉장히 넓은 범위와 다양한 기술을 포함하기 때문이다. 데이터 바인딩은  CheckBox 컨트롤을 불리언 변수에 연결하는 것처럼 간단할 수 있고 데이터베이스와 데이터 엔트리 패널을 연결하는 것처럼 복잡해 질 수도 있다.
컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 2가지 기능을 제공한다.
가장 간단한 바인딩은 2개의 컨트롤 사이에서 존재하는 것이다. 예를 들어 ScrollBar의 Value 프로퍼티를 보여주기 위한 Label 컨트롤을 생각해보자. 이 경우 Scrollbar의 ValueChanged 이벤트 핸들러를 연결하거나 다음의 스탠드얼론 XAML 파일과 같이 데이터 바인딩을 정의할 수 있다.

<Grid>

        <StackPanel VerticalAlignment="Center">

           <ScrollBar Name="scroll" Orientation="Horizontal"

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

            <Label HorizontalAlignment="Center"

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

        </StackPanel>

    </Grid>



<Grid>

        <StackPanel VerticalAlignment="Center">

            <ScrollBar Name="scroll" Orientation="Horizontal"

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

            <Label HorizontalAlignment="Center">

                <Label.Content>

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

                </Label.Content>

            </Label>

        </StackPanel>

    </Grid>

 

중괄호 내에 Binding 정의가 있으며, Binding 클래스의 프로퍼티 중 ElementName와 Path가 이 정의에 포함된다. 이 Binding 정의에서 ElementName은 ScrollBar의 Name속성에 부여된 이름인 scroll로 설정되고 Binding의 Path 프로퍼티는 Value로 설정되는데, 이 컨텍스트에서는 ScrollBar의 Value프로퍼티이다. 그 후 Label의 Content 프로퍼티는 ScrollBar의 Value프로퍼티와 바인딩되어 ScrollBar의 조작에 따라 값이 Label에 출력된다.



바인딩은 4가지의 모드를 가지고 있다.
OneWay, TwoWay, OneTime, OneWayTosource로 나열할 수 있다.

기본적인 형태는 아래와 같다. 

<Label HorizontalAlignment="Center"

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

 

또한 모드를 TwoWay로 설정할 수도 있다. 

<Label HorizontalAlignment="Center"

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

이 프로그램에서 TwoWay는 기능상 OneWay와 동일하지만 실제로는 Label의 Content 프로퍼티의 변화도 ScrollBar의 Value프로퍼티에 반영된다. 

<Label HorizontalAlignment="Center"

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

 OneTime의 경우 타깃이 소스로부터 초기화되지만 소스의 변화가 계속적으로 반영되지 않고 초기에 한번만 반영된다. 이 프로그래에서는 ScrollBar의 초기 Value가 0이기 때문에 Label이 0을 표시하며, 표시된 값은 ScrollBar의 변화에 더 이상 반응하지 않는다.

 

<Label HorizontalAlignment="Center"

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

 이것은 일반적으로 생각하는 소스와 타깃의 의미에 반대되게 타깃이 소스를 갱신하는 형태이다. 마치 과녁이 거꾸로 화살 쪽으로 날아와 과녁의 중심을 스스로 찌르는 듯한 형태라고 볼 수 있다. 따라서 타깃(Label)은 소스(ScrollBar)를 갱신해야 한다.

DataContext 프로퍼티가 상당히 유용할 때가 있는데, DataContext가 엘리먼트 트리를 통해 상속되기 때문에 하나의 엘리먼트에 DataContext를 사용해 바인딩을 설정하면 aems 자식 엘리먼트에도 동일하게 적용된다.

<Grid>

        <StackPanel VerticalAlignment="Center" 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}">Bound Button</Button>

        </StackPanel>

    </Grid>

DataContext StackPanel엘리먼트에서 한 번 설정되었고 Label Button ScrollBar와 바운딩됐다. Label에 바운딩된 프로퍼티는 Context이지만 Button에 바운딩된 프로퍼티는 FontSize이기 때문에 ScrollBar의 막대를 움직이면 Button 내부의 텍스트가 점점 커지고 이에 따라 Button 자체도 커지게 된다.







저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0

강군v's Blog is powered by Daum & tistory

 

티스토리 툴바