길고 중요한 내용이라 페이지를 추가했다.
바인딩(걸수 있는)소스
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을 데이터를 표시하는 경우.
그리고
그런데, 직접 구현하기보다는
변경 알림 기능이 제공 되어야 한다.
다른 주의사항
바인딩 불가능한 항목
Source 또는 DataContext 속성을 사용하여, 바인딩 소스를 지정한 다음,
바인딩 키워드 ( {Binding} )를 사용하면 된다.
컬렉션의 각 요소(아이템 오브젝트)들은 인스턴스 각각이 바인딩 되는 소스로 사용된다.
예 | 유저주문(CustomOrder)에 대한 유저주문리스트컬렉션(CustomOrders) |
이를 위해서는 기본은,
컬렉션의 삽입,삭제시 UI가 자동 업데이트 되려면 (동적 바인딩)
하지만 매번 작성할 필요 없이,
마지막,
바인딩 후에, (1) 정렬하거나 (2) 필터링하거나 (3) 그룹화 가능.
ICollectionView 인터페이스를 구현하는 클래스를 컬렉션뷰로 사용
소스 컬렉션 변경 없이, 정렬/필터/그룹화 한 뒤 탐색,표시하는데 사용한다.
INotifyCollectionChanged 인터페이스가 구현 되어 있는 경우, CollectionChagned 이벤트 발생시 변경 내용은 뷰로 전파된다.
소스 (원본) 컬렉션을 손대지 않기 때문에,
뷰개체Object를 인스턴스화 한 다음, 바인딩 소스로 사용하는 방법.
뷰 자체를 데이터 소스로 설정하였다. |
---|
<Window.Resources> <!-- AuctionItems 는 ObservableCollection<T> 형식의 컬렉션. CollectionViewSource 는 CollectionView의 프록시라나..(뭐지?) --> <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}" x:Key="listingDataView" /> </Window.Resources> |
바인딩 소스(컬렉션뷰 as 바인딩 소스)를 사용하기 |
---|
<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8" ItemsSource="{Binding Source={StaticResource listingDataView}}"> |
같은 데이터 소스 컬렉션에 대한 추가 뷰를 만들려면, 다른 CollectionViewSource 인스턴스를 만들고 다른 x:Key 이름을 지정합니다.
아 귀찮다. 나중에 보자. 참고 url은 머리글을 클릭할 때 GridView 열 정렬
나중에
나중에 읽어볼 것 : 데이터 템플릿 개요
중요한 것 같은데, 일단 패스.
PresentationTraceSources.TraceLevel 로 상태 정보를 받을 수 있다는데.
예제 |
---|
<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 참고 URL : 데이터 바인딩 개요