sdk:wpf:데이터_바인딩_msdn
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
sdk:wpf:데이터_바인딩_msdn [2017/07/11 17:35] – 만듦 kieuns | sdk:wpf:데이터_바인딩_msdn [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | |||
+ | 길고 중요한 내용이라 페이지를 추가했다. | ||
+ | |||
+ | ====== 바인딩 ====== | ||
+ | |||
+ | 바인딩(걸수 있는)소스 | ||
+ | |||
+ | * CLR 개체< | ||
+ | * XML 데이터 또는 파일 | ||
+ | * ADO.Net 데이터 | ||
+ | * UIElement(? | ||
+ | * List와 같은 목록 개체< | ||
+ | |||
+ | Mode (연결 방식) | ||
+ | |||
+ | * OneWay | ||
+ | * TwoWay | ||
+ | * OneWayToSource | ||
+ | |||
+ | ===== 퀵 : 정적 바인딩의 예시 ===== | ||
+ | |||
+ | 한눈에 알아보기. 다소 배경 지식이 있어야 한눈에 보이겠지만. | ||
+ | |||
+ | <code xml> | ||
+ | <Window | ||
+ | xmlns=" | ||
+ | xmlns: | ||
+ | |||
+ | xmlns: | ||
+ | |||
+ | Title=" | ||
+ | |||
+ | <!-- Window 태그의 리소스 부분에 (??)를 연결 --> | ||
+ | < | ||
+ | <!-- SomeList1, SomeList2 라는 클래스를 " | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | <!-- 위에서 정의한 리소스를 DataContext에 선언해서 사용한다. --> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <!-- 윈도우가 아닌 탭 또는 그리드에도 " | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====== 바인딩 소스 업데이트 방식 ====== | ||
+ | |||
+ | * 소스업데이트 : TwoWay, OneWayToSource 의 바인딩은 대상 속성< | ||
+ | | ||
+ | * 소스 업데이트 트리거 : 바인딩 소스에 변경 내용을 전파하는 타이밍 | ||
+ | * LostFocus : focus를 잃었을때 | ||
+ | * PropertyChanged : 입력이 진행 중인 과정 사이 사이에 (TextBox에 타이핑 하는 쭉쭉 전송) | ||
+ | * Explicit : 응용프로그램에서 UpdateSource를 호출할때 | ||
+ | |||
+ | * 변경하는 방법 ( UpdateSourceTrigger ) | ||
+ | |||
+ | ====== 바인딩 소스 지정 : 개요 ====== | ||
+ | |||
+ | * 해당 개체< | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * DataContext에 정의 된 바인딩 소스는, 선언된 태그의 하위 영역 안에서는 적용 가능하지만, | ||
+ | * 바인딩 소스가 여럿인 경우도 있으므로 Source를 직접 정의하는 방법도 있다. | ||
+ | |||
+ | <code xml> | ||
+ | <!-- 위에서 이어지는 코드 --> | ||
+ | <Button Width=" | ||
+ | Background=" | ||
+ | </ | ||
+ | |||
+ | 이외에도 | ||
+ | |||
+ | * ElementName 속성< | ||
+ | * ElementName : 응용 프로그램의 다른 요소에 바인딩할때 | ||
+ | * RelativeSource : ControlTemplate, | ||
+ | |||
+ | ===== 값에 대한 경로 지정 ===== | ||
+ | |||
+ | 바인딩소스가 | ||
+ | |||
+ | = Path : 개체< | ||
+ | = XPath : XML 데이터. 속성 ([[http:// | ||
+ | * Path가 되는 경우도 있다네 : XPath 쿼리 결과에서 Name 속성을 사용하려고 할때 | ||
+ | |||
+ | 개체< | ||
+ | |||
+ | <code xml> | ||
+ | <!-- 위에서 이어지는 코드 --> | ||
+ | <ListBox ItemSource=" | ||
+ | </ | ||
+ | |||
+ | * ListBox는 DockPanel의 DataContext를 상속 | ||
+ | * 경로가 없으므로, | ||
+ | |||
+ | 코드로 보고 이해하는 바인딩 | ||
+ | |||
+ | <code csharp> | ||
+ | //make a new source | ||
+ | MyData myDataObject = new MyData(DateTime.Now); | ||
+ | Binding myBinding = new Binding(" | ||
+ | myBinding.Source = myDataObject; | ||
+ | myText.SetBinding(TextBlock.TextProperty, | ||
+ | </ | ||
+ | |||
+ | ====== 바인딩 소스 지정 : 방법 ====== | ||
+ | |||
+ | ====== 컬렉션에 바인딩 ====== | ||
+ | |||
+ | ListBox, ListView, TreeView 류의 ItemsControl을 데이터를 표시하는 경우. | ||
+ | |||
+ | * ItemsSource 속성을 사용. ( ItemsSource 속성은 ItemsControl 의 내용 ) | ||
+ | * 기본 OneWay이므로 바인딩은 OneWay ( 디폴트로? | ||
+ | |||
+ | ===== 컬렉션 구현 방법 ===== | ||
+ | |||
+ | * IEnumerable 인터페이스를 구현하는 모든 컬렉션을 사용(열거)가능 | ||
+ | * 삽입, | ||
+ | * 내부 컬렉션이 변경될때마다 발생되는 이벤트를 갖고 있다. (노출) | ||
+ | |||
+ | 그리고 | ||
+ | * INotifyCollectionChanged 인터페이스를 노출(사용? | ||
+ | * 하지만 완전 지원(제어)를 위해서는 INotifyCollectionChanged 구현할 필요가 있다. | ||
+ | | ||
+ | 그런데, **직접 구현하기보다는** | ||
+ | * ObservableCollection< | ||
+ | * 고급 (진짜 통 제어)를 하려면 IList를 쓰라고 하네. | ||
+ | |||
+ | ====== 바인딩 소스 : 좀 더 상세하게 ====== | ||
+ | |||
+ | ===== 바인딩 소스 클래스 구현 ===== | ||
+ | |||
+ | 변경 알림 기능이 제공 되어야 한다. | ||
+ | |||
+ | 다른 주의사항 | ||
+ | |||
+ | * 기본 생성자가 필요하다! | ||
+ | * 바인딩할 속성< | ||
+ | * 클래스에 선언된 속성의 형식< | ||
+ | |||
+ | 바인딩 불가능한 항목 | ||
+ | |||
+ | * 인터페이스 속성< | ||
+ | |||
+ | * 기본 구현이 없는 protected, private, 가상(? | ||
+ | |||
+ | * public field 에는 바인딩 불가. < | ||
+ | | ||
+ | * WPF에서 이해할 수 없는 커스텀 데이터 형식 | ||
+ | |||
+ | ===== 전체 개체(Object)를 바인딩 소스로 사용 ===== | ||
+ | |||
+ | Source 또는 DataContext 속성을 사용하여, | ||
+ | |||
+ | 바인딩 키워드 ( %%{Binding}%% )를 사용하면 된다. | ||
+ | |||
+ | * 이게 필요한 경우 : \\ 문자열 형식의 오브젝트에 바인딩하거나, | ||
+ | * 또한 상세 세부 문서가 있는데.. <color silver>< | ||
+ | |||
+ | ===== 컬렉션 오브젝트를 바인딩 소스로 사용 ===== | ||
+ | |||
+ | 컬렉션의 각 요소(아이템 오브젝트)들은 인스턴스 각각이 바인딩 되는 소스로 사용된다. | ||
+ | |||
+ | | 예 | 유저주문(CustomOrder)에 대한 유저주문리스트컬렉션(CustomOrders) | | ||
+ | |||
+ | 이를 위해서는 기본은, | ||
+ | |||
+ | * IEnumerable 인터페이스를 구현하는 컬렉션을 작성해야 한다. | ||
+ | |||
+ | 컬렉션의 삽입, | ||
+ | |||
+ | * INotifyCollectionChanged 인터페이스를 구현해야 한다. | ||
+ | |||
+ | 하지만 매번 작성할 필요 없이, | ||
+ | |||
+ | * ObservableCollection< | ||
+ | |||
+ | * 컬렉션의 각 오브젝트는 위 섹션의 조건을 만족해야 하는데, 좀 더 상세히 보려면 또 여기로.. 쌍. 또 있네. 아무튼 여기 \\ [[http:// | ||
+ | |||
+ | * 추천은 직접 구현 보다는, \\ ObservableCollection< | ||
+ | |||
+ | 마지막, | ||
+ | |||
+ | * 컬렉션의 경우 직접 바인딩 되지 않고, 직접 바인딩 되는 것 처럼 보이지만, | ||
+ | |||
+ | * 아주 고급< | ||
+ | |||
+ | ===== 데이터 바인딩의 권한 요구 사항 ===== | ||
+ | |||
+ | - CLR 의 경우, 소스 프로퍼티를 쓸 수 있으면 사용한다. 없으면 에러 표시. | ||
+ | - 컴파일 타임 또는 런타임시 결정되는 동적 오브젝트에도 바인딩은 가능 \\ 컴파일 전까지는 에러 표시하겠지만. | ||
+ | - 디펜던시 프로퍼티에도 바인딩 가능 | ||
+ | |||
+ | |||
+ | ====== 컬렉션 뷰 ====== | ||
+ | |||
+ | 바인딩 후에, (1) 정렬하거나 (2) 필터링하거나 (3) 그룹화 가능. | ||
+ | |||
+ | ICollectionView 인터페이스를 구현하는 클래스를 컬렉션뷰로 사용 | ||
+ | |||
+ | ===== 컬렉션 뷰의 정의 ===== | ||
+ | |||
+ | 소스 컬렉션 변경 없이, 정렬/ | ||
+ | |||
+ | INotifyCollectionChanged 인터페이스가 구현 되어 있는 경우, CollectionChagned 이벤트 발생시 변경 내용은 뷰로 전파된다. | ||
+ | |||
+ | 소스 (원본) 컬렉션을 손대지 않기 때문에, | ||
+ | * 소스는 여러 뷰를 갖을 수 있고 | ||
+ | * 동일한 데이터를 여러 방식을 표시할 수 있다. | ||
+ | |||
+ | ===== 컬렉션 뷰를 만드는 방법 ===== | ||
+ | |||
+ | * MSDN 링크 : [[http:// | ||
+ | |||
+ | 뷰개체< | ||
+ | |||
+ | |< 95% >| | ||
+ | ^ 뷰 자체를 데이터 소스로 설정하였다. ^ | ||
+ | | <code xml> | ||
+ | < | ||
+ | <!-- | ||
+ | AuctionItems 는 ObservableCollection< | ||
+ | CollectionViewSource 는 CollectionView의 프록시라나..(뭐지? | ||
+ | | ||
+ | --> | ||
+ | < | ||
+ | Source=" | ||
+ | x: | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |< 95% >| | ||
+ | ^ 바인딩 소스(컬렉션뷰 as 바인딩 소스)를 사용하기 ^ | ||
+ | | <code xml> | ||
+ | <ListBox Name=" | ||
+ | ItemsSource=" | ||
+ | </ | ||
+ | |||
+ | **같은 데이터 소스 컬렉션에 대한 추가 뷰를 만들려면, | ||
+ | |||
+ | ==== 기본 뷰 ==== | ||
+ | |||
+ | * 바인딩 소스로 사용되는 컬렉션에 기본 뷰를 만듦. | ||
+ | * 컬렉션에 직접 바인딩하면 이 기본 뷰가 적용되는 구조. | ||
+ | * 이 컬렉션을 사용하는 모든 바인딩에 이 기본 뷰가 적용 된다. | ||
+ | | ||
+ | * 기본뷰를 변경하면, | ||
+ | |||
+ | ==== 정렬 ==== | ||
+ | |||
+ | 아 귀찮다. 나중에 보자. 참고 url은 [[http:// | ||
+ | |||
+ | ==== 필터 ==== | ||
+ | ==== 그룹화 ==== | ||
+ | |||
+ | 나중에 | ||
+ | |||
+ | ====== 데이터 템플릿 ====== | ||
+ | |||
+ | * 데이터 표시 방법을 임의로 정의. | ||
+ | * 컬렉션을 표시하는 방법에 대해서 지침이 없으면 기본 컬렉션의 내용을 표시. | ||
+ | * DataTemplate를 사용해서, | ||
+ | |||
+ | 나중에 읽어볼 것 : [[http:// | ||
+ | |||
+ | ====== 데이터 유효성 검사 ====== | ||
+ | |||
+ | 중요한 것 같은데, 일단 패스. | ||
+ | |||
+ | ====== 디버깅 ====== | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | |< 95% >| | ||
+ | ^ 예제 ^ | ||
+ | |<code xml> | ||
+ | <Window | ||
+ | xmlns: | ||
+ | xmlns: | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | <!-- ... --> | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <Binding Source=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <!-- ... --> | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====== MSDN 레퍼런스 ====== | ||
+ | |||
+ | **MSDN 참고 URL** : [[http:// | ||
+ | |||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||