사용자 도구

사이트 도구


sdk:wpf:데이터_바인딩_msdn

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
sdk:wpf:데이터_바인딩_msdn [2017/07/11 18:43] – [알수 없는 것들] kieunssdk:wpf:데이터_바인딩_msdn [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +
 +길고 중요한 내용이라 페이지를 추가했다.
 +
 +====== 바인딩 ======
 +
 +바인딩(걸수 있는)소스
 +
 +  * CLR 개체<sup>Object</sup>
 +  * XML 데이터 또는 파일
 + * ADO.Net 데이터
 + * UIElement(?)
 + * List와 같은 목록 개체<sup>Object</sup>
 +
 +Mode (연결 방식)
 +
 +  * OneWay
 + * TwoWay
 + * OneWayToSource
 +
 +===== 퀵 : 정적 바인딩의 예시 =====
 +
 +한눈에 알아보기. 다소 배경 지식이 있어야 한눈에 보이겠지만.
 +
 +<code xml>
 +<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"가 붙는다면 정의 가능. -->
 +</code>
 +
 +
 +====== 바인딩 소스 업데이트 방식 ======
 +
 +  * 소스업데이트 : TwoWay, OneWayToSource 의 바인딩은 대상 속성<sup>Property</sup>의 변경 내용을 수신, 다시 바인딩 소스에 전파.
 +  
 +  * 소스 업데이트 트리거 : 바인딩 소스에 변경 내용을 전파하는 타이밍
 +    * LostFocus : focus를 잃었을때
 +    * PropertyChanged : 입력이 진행 중인 과정 사이 사이에 (TextBox에 타이핑 하는 쭉쭉 전송)
 +    * Explicit : 응용프로그램에서 UpdateSource를 호출할때
 +
 +  * 변경하는 방법 ( UpdateSourceTrigger )
 +
 +====== 바인딩 소스 지정 : 개요 ======
 +
 +  * 해당 개체<sup>Object</sup>의 '.Resource' 의 태그에서 DataContext 로 데이터 지정
 +
 +<code xml>
 +<DockPanel.Resource>
 +  <c:MyData x:Key="myDataSource"/>
 +</DockPanel.Resource>
 +</code>
 +
 +  * DataContext에 정의 된 바인딩 소스는, 선언된 태그의 하위 영역 안에서는 적용 가능하지만,
 +  * 바인딩 소스가 여럿인 경우도 있으므로 Source를 직접 정의하는 방법도 있다.
 +
 +<code xml>
 +<!-- 위에서 이어지는 코드 -->
 +<Button Width="150" Height="30"
 + Background="{Binding Source={StaticResource myDataSource}, Path=ColorName}">BTN_TEXT</Button>
 +</code>
 +
 +이외에도
 +
 +  * ElementName 속성<sup>Property</sup>, RelativeSource 속성을 사용해서 지정
 +  * ElementName : 응용 프로그램의 다른 요소에 바인딩할때
 +  * RelativeSource : ControlTemplate, Style 에서 바인딩할때
 +
 +===== 값에 대한 경로 지정 =====
 +
 +바인딩소스가
 +
 +  = 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 속성을 사용하려고 할때
 +
 +개체<sup>Object</sup> 전부를 바인딩 하는 경우 ( 바인딩 소스 개체<sup>Object</sup> == 사용할 값 ) 에는 path를 지정하지 않는다.
 +
 +<code xml>
 +<!-- 위에서 이어지는 코드 -->
 +<ListBox ItemSource="{Binding}" IsSynchronizedWithCurrentItem="true"/>
 +</code>
 +
 +  * ListBox는 DockPanel의 DataContext를 상속
 +  * 경로가 없으므로, 개체<sup>Object</sup> 전체에 바인딩
 +
 +코드로 보고 이해하는 바인딩
 +
 +<code csharp>
 +//make a new source
 +MyData myDataObject = new MyData(DateTime.Now);      
 +Binding myBinding = new Binding("MyDataProperty");
 +myBinding.Source = myDataObject;
 +myText.SetBinding(TextBlock.TextProperty, myBinding);
 +</code>
 +
 +====== 바인딩 소스 지정 : 방법 ======
 +
 +====== 컬렉션에 바인딩 ======
 +
 +ListBox, ListView, TreeView 류의 ItemsControl을 데이터를 표시하는 경우.
 +
 +  * ItemsSource 속성을 사용. ( ItemsSource 속성은 ItemsControl 의 내용 )
 +  * 기본 OneWay이므로 바인딩은 OneWay ( 디폴트로? )
 +
 +===== 컬렉션 구현 방법 =====
 +
 +  * IEnumerable 인터페이스를 구현하는 모든 컬렉션을 사용(열거)가능
 +  * 삽입,삭제시 UI가 자동으로 업데이트 되려면, 컬렉션에 INotifyCollectionChanged 인터페이스 구현 필요.
 +    * 내부 컬렉션이 변경될때마다 발생되는 이벤트를 갖고 있다. (노출)
 +
 +그리고
 +  * INotifyCollectionChanged 인터페이스를 노출(사용?)하는 기본 제공 구현 ObservableCollection<T>가 있다.
 +  * 하지만 완전 지원(제어)를 위해서는 INotifyCollectionChanged 구현할 필요가 있다.
 +  
 +그런데, **직접 구현하기보다는**
 +  * ObservableCollection<T>, List<T>, Collection<T>, BindingList<T>와 같은 컬렉션클래스 중에 하나를 사용하는 것이 좋다네.<sup><del>뭐라고? 놀리는거야?</del></sup>
 +  * 고급 (진짜 통 제어)를 하려면 IList를 쓰라고 하네.
 +
 +====== 바인딩 소스 : 좀 더 상세하게 ======
 +
 +===== 바인딩 소스 클래스 구현 =====
 +
 +변경 알림 기능이 제공 되어야 한다.
 +
 +다른 주의사항
 +
 +  * 기본 생성자가 필요하다!
 +  * 바인딩할 속성<sup>Property</sup>은, 공용(public)이어야 한다.
 +  * 클래스에 선언된 속성의 형식<sup>타입들</sup>이 바인딩에 전달되는 값형식이 되는데, 이 형식을 WPF가 이해할 수 없는 custom 형식이면 IValueConverter 를 사용하여 표시 가능하게 변경해 줘야 한다.
 +
 +바인딩 불가능한 항목
 +
 +  * 인터페이스 속성<sup>Property</sup>은 바인딩 불가
 +
 +  * 기본 구현이 없는 protected, private, 가상(?)속성도 사용 불가
 +
 +  * public field 에는 바인딩 불가. <sup>공용필드,public field가 뭐지?</sup>
 +  
 +  * WPF에서 이해할 수 없는 커스텀 데이터 형식
 +
 +===== 전체 개체(Object)를 바인딩 소스로 사용 =====
 +
 +Source 또는 DataContext 속성을 사용하여, 바인딩 소스를 지정한 다음,
 +
 +바인딩 키워드 ( %%{Binding}%% )를 사용하면 된다.
 +
 +  * 이게 필요한 경우 : \\ 문자열 형식의 오브젝트에 바인딩하거나, \\ 프로퍼티 여럿이 있는 오브젝트에 바인딩 하거나 \\ 컬렉션 오브젝트에 바인딩하거나
 +  * 또한 상세 세부 문서가 있는데.. <color silver><sup>세부 문서가 또 있어??</sup></color> \\ [[http://msdn.microsoft.com/ko-kr/library/ms742531(v=vs.110).aspx|방법: 계층적 데이터에 마스터-세부 패턴 사용(한)]], [[http://msdn.microsoft.com/en-us/library/ms742531(v=vs.110).aspx|방법: 계층적 데이터에 마스터-세부 패턴 사용(영)]]
 +
 +===== 컬렉션 오브젝트를 바인딩 소스로 사용 =====
 +
 +컬렉션의 각 요소(아이템 오브젝트)들은 인스턴스 각각이 바인딩 되는 소스로 사용된다.
 +
 +| 예 | 유저주문(CustomOrder)에 대한 유저주문리스트컬렉션(CustomOrders) |
 +
 +이를 위해서는 기본은,
 +
 +  * IEnumerable 인터페이스를 구현하는 컬렉션을 작성해야 한다.
 +
 +컬렉션의 삽입,삭제시 UI가 자동 업데이트 되려면 (동적 바인딩) 
 +
 +  * INotifyCollectionChanged 인터페이스를 구현해야 한다.
 +
 +하지만 매번 작성할 필요 없이,
 +
 +  * ObservableCollection<T> 클래스를 사용해서 데이터 컬렉션을 준비할 수 있다.
 +
 +  * 컬렉션의 각 오브젝트는 위 섹션의 조건을 만족해야 하는데, 좀 더 상세히 보려면 또 여기로.. 쌍. 또 있네. 아무튼 여기 \\ [[http://msdn.microsoft.com/ko-kr/library/ms748365(v=vs.110).aspx|방법: ObservableCollection 만들기 및 바인딩]]
 +
 +  * 추천은 직접 구현 보다는, \\ ObservableCollection<T>, List<T>, Collection<T>, BindingList<T> 와 같은 미리 준비된 컬렉션을 사용하기.
 +
 +마지막,
 +
 +  * 컬렉션의 경우 직접 바인딩 되지 않고, 직접 바인딩 되는 것 처럼 보이지만, **컬렉션의 뷰에 바인딩** 된다.
 +
 +  * 아주 고급<sup>이 뭔지 모르겠지만</sup> 컬렉션 구현시, IList를 사용.
 +
 +===== 데이터 바인딩의 권한 요구 사항 =====
 +
 +  - CLR 의 경우, 소스 프로퍼티를 쓸 수 있으면 사용한다. 없으면 에러 표시.
 +  - 컴파일 타임 또는 런타임시 결정되는 동적 오브젝트에도 바인딩은 가능 \\ 컴파일 전까지는 에러 표시하겠지만.
 +  - 디펜던시 프로퍼티에도 바인딩 가능
 +
 +
 +====== 컬렉션 뷰 ======
 +
 +바인딩 후에, (1) 정렬하거나 (2) 필터링하거나 (3) 그룹화 가능. 
 +
 +ICollectionView 인터페이스를 구현하는 클래스를 컬렉션뷰로 사용
 +
 +===== 컬렉션 뷰의 정의 =====
 +
 +소스 컬렉션 변경 없이, 정렬/필터/그룹화 한 뒤 탐색,표시하는데 사용한다.
 +
 +INotifyCollectionChanged 인터페이스가 구현 되어 있는 경우, CollectionChagned 이벤트 발생시 변경 내용은 뷰로 전파된다.
 +
 +소스 (원본) 컬렉션을 손대지 않기 때문에,
 +  * 소스는 여러 뷰를 갖을 수 있고
 +  * 동일한 데이터를 여러 방식을 표시할 수 있다.
 +
 +===== 컬렉션 뷰를 만드는 방법 =====
 +
 +  * MSDN 링크 : [[http://msdn.microsoft.com/ko-kr/library/ms752347(v=vs.110).aspx#collection_views|컬렉션뷰]]
 +
 +뷰개체<sup>Object</sup>를 인스턴스화 한 다음, 바인딩 소스로 사용하는 방법.
 +
 +|< 95% >|
 +^ 뷰 자체를 데이터 소스로 설정하였다. ^
 +| <code xml>
 +<Window.Resources>
 +<!--
 +  AuctionItems 는 ObservableCollection<T> 형식의 컬렉션.
 +  CollectionViewSource 는 CollectionView의 프록시라나..(뭐지?)
 +  
 +-->
 +<CollectionViewSource 
 +  Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}"   
 +  x:Key="listingDataView" />
 +
 +</Window.Resources>
 +</code> |
 +
 +|< 95% >|
 +^ 바인딩 소스(컬렉션뷰 as 바인딩 소스)를 사용하기 ^
 +| <code xml>
 +<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
 +    ItemsSource="{Binding Source={StaticResource listingDataView}}">
 +</code> |
 +
 +**같은 데이터 소스 컬렉션에 대한 추가 뷰를 만들려면, 다른 CollectionViewSource 인스턴스를 만들고 다른 x:Key 이름을 지정합니다.**
 +
 +==== 기본 뷰 ====
 +
 +  * 바인딩 소스로 사용되는 컬렉션에 기본 뷰를 만듦.
 +  * 컬렉션에 직접 바인딩하면 이 기본 뷰가 적용되는 구조.
 +  * 이 컬렉션을 사용하는 모든 바인딩에 이 기본 뷰가 적용 된다.
 +  
 +  * 기본뷰를 변경하면, 컬렉션을 사용하는 모든 바인딩에 적용된다.
 +
 +==== 정렬 ====
 +
 +아 귀찮다. 나중에 보자. 참고 url은 [[http://msdn.microsoft.com/ko-kr/library/ms745786(v=vs.110).aspx|머리글을 클릭할 때 GridView 열 정렬]]
 +
 +==== 필터 ====
 +==== 그룹화 ====
 +
 +나중에
 +
 +====== 데이터 템플릿 ======
 +
 +  * 데이터 표시 방법을 임의로 정의.
 +    * 컬렉션을 표시하는 방법에 대해서 지침이 없으면 기본 컬렉션의 내용을 표시.
 +  * DataTemplate를 사용해서, 표시 방법을 재 정의.
 +
 +나중에 읽어볼 것 : [[http://msdn.microsoft.com/ko-kr/library/ms742521(v=vs.110).aspx|데이터 템플릿 개요]]
 +
 +====== 데이터 유효성 검사 ======
 +
 +중요한 것 같은데, 일단 패스.
 +
 +====== 디버깅 ======
 +
 +[[http://msdn.microsoft.com/ko-kr/library/system.diagnostics.presentationtracesources.tracelevel(v=vs.110).aspx|PresentationTraceSources.TraceLevel]] 로 상태 정보를 받을 수 있다는데.
 +
 +|< 95% >|
 +^ 예제 ^
 +|<code xml>
 +<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>
 +</code> |
 +
 +
 +====== MSDN 레퍼런스 ======
 +
 +**MSDN 참고 URL** : [[http://msdn.microsoft.com/ko-kr/library/ms752347(v=vs.110).aspx|데이터 바인딩 개요]]
 +
 +  - [[http://msdn.microsoft.com/ko-kr/library/ms752039(v=vs.110).aspx|데이터바인딩방법]]
 +  - [[http://msdn.microsoft.com/ko-kr/library/ms752347(v=vs.110).aspx#binding_to_collections|컬렉션에 바인딩]]
 +  - [[http://msdn.microsoft.com/ko-kr/magazine/cc700358.aspx|데이터 바인딩과 WPF를 사용한 데이터 표시 사용자 지정]]