목차

길고 중요한 내용이라 페이지를 추가했다.

바인딩

바인딩(걸수 있는)소스

Mode (연결 방식)

퀵 : 정적 바인딩의 예시

한눈에 알아보기. 다소 배경 지식이 있어야 한눈에 보이겠지만.

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
	xmlns:thisapp="clr-namespace:ThisApp"
 
	Title="TestCode">
 
	<!-- Window 태그의 리소스 부분에 (??)를 연결 -->
	<Window.Resource>
		<!-- SomeList1, SomeList2 라는 클래스를 "SomeList1", "SomeList2"로 정의한다. -->
		<thisapp:SomeList1 x:Key="SomeList1"/>
		<thisapp:SomeList2 x:Key="SomeList2"/>
	</Window.Resource>
 
	<!-- 위에서 정의한 리소스를 DataContext에 선언해서 사용한다. -->
	<TextBlock Name="textBox2" DataContext="{StaticResource SomeList1}">
		<TextBlock.Text>
			<Binding Path="DefaultText"/>
		</TextBlock.Text>
	</TextBlock>
 
</Window>
 
<!-- 윈도우가 아닌 탭 또는 그리드에도 ".Resource"가 붙는다면 정의 가능. -->

바인딩 소스 업데이트 방식

바인딩 소스 지정 : 개요

<DockPanel.Resource>
  <c:MyData x:Key="myDataSource"/>
</DockPanel.Resource>
<!-- 위에서 이어지는 코드 -->
<Button Width="150" Height="30"
		Background="{Binding Source={StaticResource myDataSource}, Path=ColorName}">BTN_TEXT</Button>

이외에도

값에 대한 경로 지정

바인딩소스가

= Path : 개체<sup>Object, Class</sup> : Path 속성을 사용 ([[http://msdn.microsoft.com/ko-kr/library/system.windows.data.binding.path(v=vs.110).aspx|Path]])
= XPath : XML 데이터. 속성 ([[http://msdn.microsoft.com/ko-kr/library/system.windows.data.binding.xpath(v=vs.110).aspx|XPath]])
  * Path가 되는 경우도 있다네 : XPath 쿼리 결과에서 Name 속성을 사용하려고 할때

개체Object 전부를 바인딩 하는 경우 ( 바인딩 소스 개체Object == 사용할 값 ) 에는 path를 지정하지 않는다.

<!-- 위에서 이어지는 코드 -->
<ListBox ItemSource="{Binding}" IsSynchronizedWithCurrentItem="true"/>

코드로 보고 이해하는 바인딩

//make a new source
MyData myDataObject = new MyData(DateTime.Now);      
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
myText.SetBinding(TextBlock.TextProperty, myBinding);

바인딩 소스 지정 : 방법

컬렉션에 바인딩

ListBox, ListView, TreeView 류의 ItemsControl을 데이터를 표시하는 경우.

컬렉션 구현 방법

그리고

그런데, 직접 구현하기보다는

바인딩 소스 : 좀 더 상세하게

바인딩 소스 클래스 구현

변경 알림 기능이 제공 되어야 한다.

다른 주의사항

바인딩 불가능한 항목

전체 개체(Object)를 바인딩 소스로 사용

Source 또는 DataContext 속성을 사용하여, 바인딩 소스를 지정한 다음,

바인딩 키워드 ( {Binding} )를 사용하면 된다.

컬렉션 오브젝트를 바인딩 소스로 사용

컬렉션의 각 요소(아이템 오브젝트)들은 인스턴스 각각이 바인딩 되는 소스로 사용된다.

유저주문(CustomOrder)에 대한 유저주문리스트컬렉션(CustomOrders)

이를 위해서는 기본은,

컬렉션의 삽입,삭제시 UI가 자동 업데이트 되려면 (동적 바인딩)

하지만 매번 작성할 필요 없이,

마지막,

데이터 바인딩의 권한 요구 사항

  1. CLR 의 경우, 소스 프로퍼티를 쓸 수 있으면 사용한다. 없으면 에러 표시.
  2. 컴파일 타임 또는 런타임시 결정되는 동적 오브젝트에도 바인딩은 가능
    컴파일 전까지는 에러 표시하겠지만.
  3. 디펜던시 프로퍼티에도 바인딩 가능

컬렉션 뷰

바인딩 후에, (1) 정렬하거나 (2) 필터링하거나 (3) 그룹화 가능.

ICollectionView 인터페이스를 구현하는 클래스를 컬렉션뷰로 사용

컬렉션 뷰의 정의

소스 컬렉션 변경 없이, 정렬/필터/그룹화 한 뒤 탐색,표시하는데 사용한다.

INotifyCollectionChanged 인터페이스가 구현 되어 있는 경우, CollectionChagned 이벤트 발생시 변경 내용은 뷰로 전파된다.

소스 (원본) 컬렉션을 손대지 않기 때문에,

컬렉션 뷰를 만드는 방법

뷰개체Object를 인스턴스화 한 다음, 바인딩 소스로 사용하는 방법.

< 95% >
뷰 자체를 데이터 소스로 설정하였다.
<Window.Resources>
<!--
  AuctionItems 는 ObservableCollection<T> 형식의 컬렉션.
  CollectionViewSource 는 CollectionView의 프록시라나..(뭐지?)
 
-->
<CollectionViewSource 
  Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}"   
  x:Key="listingDataView" />
 
</Window.Resources>
< 95% >
바인딩 소스(컬렉션뷰 as 바인딩 소스)를 사용하기
<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">

같은 데이터 소스 컬렉션에 대한 추가 뷰를 만들려면, 다른 CollectionViewSource 인스턴스를 만들고 다른 x:Key 이름을 지정합니다.

기본 뷰

정렬

아 귀찮다. 나중에 보자. 참고 url은 머리글을 클릭할 때 GridView 열 정렬

필터

그룹화

나중에

데이터 템플릿

나중에 읽어볼 것 : 데이터 템플릿 개요

데이터 유효성 검사

중요한 것 같은데, 일단 패스.

디버깅

PresentationTraceSources.TraceLevel 로 상태 정보를 받을 수 있다는데.

< 95% >
예제
<Window
  xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
  xmlns:src="clr-namespace:SDKSample">
  <Window.Resources>
    <src:Person x:Key="myDataSource" PersonName="Joe"/>
  </Window.Resources>
 
<!-- ... -->
 
<TextBox>
  <TextBox.Text>
    <Binding Source="{StaticResource myDataSource}" Path="PersonName" diag:PresentationTraceSources.TraceLevel="High"/>
  </TextBox.Text>
</TextBox>
 
<!-- ... -->
 
</Window>

MSDN 레퍼런스

MSDN 참고 URL : 데이터 바인딩 개요