데이터 바인딩 개요Data Binding Overview

WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) 데이터 바인딩은 응용 프로그램이 데이터를 제공하고 상호 작용할 수 있는 간단하고 일관된 방법을 제공합니다. data binding provides a simple and consistent way for applications to present and interact with data. 다양한 데이터 소스에서 CLR(공용 언어 런타임)common language runtime (CLR) 개체 및 XMLXML의 형태로 데이터에 요소를 바인딩할 수 있습니다.Elements can be bound to data from a variety of data sources in the form of CLR(공용 언어 런타임)common language runtime (CLR) objects and XMLXML. ContentControl와 같은 s ButtonItemsControl같은 ListBoxListView 단일 데이터 항목의 스타일을 유연한 또는 데이터 항목의 컬렉션을 사용 하도록 기능이 기본 제공 합니다.ContentControls such as Button and ItemsControls such as ListBox and ListView have built-in functionality to enable flexible styling of single data items or collections of data items. 데이터를 기반으로 정렬, 필터 및 그룹 보기를 생성할 수 있습니다.Sort, filter, and group views can be generated on top of the data.

WPFWPF의 데이터 바인딩 기능은 기본적으로 데이터 바인딩을 지원하는 광범위한 속성, 데이터의 유연한 UIUI 표현 및 UIUI와 비즈니스 논리의 분명한 분리와 같은 기존 모델에 비해 여러 가지 이점이 있습니다.The data binding functionality in WPFWPF has several advantages over traditional models, including a broad range of properties that inherently support data binding, flexible UIUI representation of data, and clean separation of business logic from UIUI.

이 항목에서는 먼저 대 한 핵심 개념을 설명 WPFWPF 데이터 바인딩 및의 사용에는 다음이 되는 Binding 클래스 및 기타 기능 데이터 바인딩.This topic first discusses concepts fundamental to WPFWPF data binding and then goes into the usage of the Binding class and other features of data binding.

데이터 바인딩이란?What Is Data Binding?

데이터 바인딩은 응용 프로그램 UIUI와 비즈니스 논리를 연결하는 프로세스입니다.Data binding is the process that establishes a connection between the application UIUI and business logic. 바인딩 설정이 올바르고 데이터가 적절한 알림을 제공하는 경우에는 데이터의 값이 변경될 때 데이터에 바인딩된 요소에 변경 내용이 자동으로 반영됩니다.If the binding has the correct settings and the data provides the proper notifications, then, when the data changes its value, the elements that are bound to the data reflect changes automatically. 또한 요소에서 데이터의 외부 표현이 변경되면 내부 데이터가 자동으로 업데이트되어 변경 내용이 반영될 수 있습니다.Data binding can also mean that if an outer representation of the data in an element changes, then the underlying data can be automatically updated to reflect the change. 예를 들어, 값을 편집 하는 사용자는 TextBox 기본 데이터 값을 사용 하는 요소는 해당 변경 내용을 반영 하도록 자동으로 업데이트 됩니다.For example, if the user edits the value in a TextBox element, the underlying data value is automatically updated to reflect that change.

데이터 바인딩은 일반적으로 서버 또는 로컬 구성 데이터를 폼이나 기타 UIUI 컨트롤에 배치하는 데 사용됩니다.A typical use of data binding is to place server or local configuration data into forms or other UIUI controls. WPFWPF에서 이 개념은 광범위한 속성을 다양한 데이터 소스에 바인딩하는 기능을 포함하도록 확장됩니다.In WPFWPF, this concept is expanded to include the binding of a broad range of properties to a variety of data sources. WPFWPF에서 요소의 종속성 속성은 CLRCLR 개체(ADO.NETADO.NET 개체 또는 웹 서비스와 웹 속성에 연결된 개체 포함) 및 XMLXML 데이터에 바인딩될 수 있습니다.In WPFWPF, dependency properties of elements can be bound to CLRCLR objects (including ADO.NETADO.NET objects or objects associated with Web Services and Web properties) and XMLXML data.

데이터 바인딩의 예는 Data Binding Demo(데이터 바인딩 데모)에서 다음 응용 프로그램 UIUI를 살펴보세요.For an example of data binding, take a look at the following application UIUI from the Data Binding Demo:

데이터 바인딩 샘플 스크린샷Data binding sample screen shot

위 그림은 작업 항목 목록을 표시하는 응용 프로그램의 UIUI입니다.The above is the UIUI of an application that displays a list of auction items. 응용 프로그램은 데이터 바인딩의 다음 기능을 보여 줍니다.The application demonstrates the following features of data binding:

  • 콘텐츠는 ListBox 의 컬렉션에 바인딩된 AuctionItem 개체입니다.The content of the ListBox is bound to a collection of AuctionItem objects. AuctionItem 개체에는 Description, StartPrice, StartDate, Category, SpecialFeatures 등의 속성이 있습니다.An AuctionItem object has properties such as Description, StartPrice, StartDate, Category, SpecialFeatures, etc.

  • 데이터 (AuctionItem 개체)에 표시 되는 ListBox 한 각 항목에 대 한 설명과 현재 가격이 표시 됩니다.The data (AuctionItem objects) displayed in the ListBox is templated so that the description and the current price are shown for each item. 이렇게 사용 하는 DataTemplate합니다.This is done using a DataTemplate. 또한 각 항목의 모양은 표시되는 AuctionItemSpecialFeatures 값에 따라 달라집니다.In addition, the appearance of each item depends on the SpecialFeatures value of the AuctionItem being displayed. AuctionItemSpecialFeatures 값이 Color이면 항목에는 파란색 테두리가 포함됩니다.If the SpecialFeatures value of the AuctionItem is Color, the item has a blue border. Highlight 값이면 항목에는 주황색 테두리와 별모양이 포함됩니다.If the value is Highlight, the item has an orange border and a star. 데이터 템플릿 섹션에서는 데이터 템플릿을 살펴봅니다.The Data Templating section provides information about data templating.

  • 사용자 그룹, 필터링 하거나, 사용 하 여 데이터를 정렬할 수는 CheckBoxes 제공 합니다.The user can group, filter, or sort the data using the CheckBoxes provided. 위, 이미지 "그룹 범주별" 및 "범주와 날짜 기준 정렬" CheckBoxes 선택 됩니다.In the image above, the "Group by category" and "Sort by category and date" CheckBoxes are selected. 데이터가 제품 범주에 따라 그룹화되고 범주 이름이 사전순으로 표시되어 있음을 알 수 있습니다.You may have noticed that the data is grouped based on the category of the product, and the category name is in alphabetical order. 그림에서 확인하기는 어렵지만 항목은 각 범주 내에서 시작 날짜별로 정렬됩니다.It is difficult to notice from the image but the items are also sorted by the start date within each category. 이 작업에는 컬렉션 뷰가 사용됩니다.This is done using a collection view. 컬렉션에 바인딩 섹션에서는 컬렉션 뷰를 살펴봅니다.The Binding to Collections section discusses collection views.

  • 사용자가 항목을 선택 된 ContentControl 선택한 항목의 세부 정보가 표시 됩니다.When the user selects an item, the ContentControl displays the details of the selected item. 이를 마스터-세부 시나리오라고 합니다.This is called the Master-Detail scenario. 마스터-세부 시나리오Scenario 섹션에서는 바인딩 시나리오 유형을 살펴봅니다.The Master-Detail Scenario section provides information about this type of binding scenario.

  • 유형의 StartDate 속성은 DateTime을 밀리초 단위로 시간을 포함 하는 날짜를 반환 하는 합니다.The type of the StartDate property is DateTime, which returns a date that includes the time to the millisecond. 이 응용 프로그램에는 더 짧은 날짜 문자열이 표시되도록 사용자 지정 변환기가 사용되었습니다.In this application, a custom converter has been used so that a shorter date string is displayed. 데이터 변환 섹션에서는 변환기를 살펴봅니다.The Data Conversion section provides information about converters.

사용자가 Add Product 단추를 클릭하면 다음과 같이 표시됩니다.When the user clicks the Add Product button, the following form comes up:

제품 목록 추가 페이지Add Product Listing page

사용자는 폼에 있는 필드를 편집하고, 짧은 미리 보기와 더 자세한 미리 보기 창을 사용하여 제품 목록을 미리 보고, submit을 클릭하여 새 제품 목록을 추가할 수 있습니다.The user can edit the fields in the form, preview the product listing using the short preview and the more detailed preview panes, and then click submit to add the new product listing. 기존 그룹화, 필터링 및 정렬 기능이 새 항목에 적용됩니다.Any existing grouping, filtering and sorting functionalities will apply to the new entry. 이 경우 위 그림에 입력된 항목은 Computer 범주에서 두 번째 항목으로 표시됩니다.In this particular case, the item entered in the above image will be displayed as the second item within the Computer category.

이 이미지에 표시 되지 않음은에서 제공 하는 유효성 검사 논리는 시작 날짜 TextBox합니다.Not shown in this image is the validation logic provided in the Start Date TextBox. 사용자가 잘못 된 입력 날짜 (잘못 된 서식 지정 또는 과거 날짜)와 사용자 알림이 표시 됩니다는 ToolTip 및 옆에 빨간색 느낌표가 TextBox합니다.If the user enters an invalid date (invalid formatting or a past date), the user will be notified with a ToolTip and a red exclamation point next to the TextBox. 데이터 유효성 검사 섹션에서는 유효성 검사 논리를 만드는 방법을 설명합니다.The Data Validation section discusses how to create validation logic.

위에서 간략히 설명한 데이터 바인딩의 다른 기능을 살펴보기 전에 먼저 다음 섹션에서는 WPFWPF 데이터 바인딩 이해에 필수적인 기본 개념을 설명합니다.Before going into the different features of data binding outlined above, we will first discuss in the next section the fundamental concepts that are critical to understanding WPFWPF data binding.

기본 데이터 바인딩 개념Basic Data Binding Concepts

바인딩할 요소 및 데이터 소스의 특성에 관계없이 각 바인딩은 항상 다음 그림에 나와 있는 모델을 따릅니다.Regardless of what element you are binding and the nature of your data source, each binding always follows the model illustrated by the following figure:

기본 데이터 바인딩 다이어그램Basic data binding diagram

위 그림과 같이 데이터 바인딩은 기본적으로 바인딩 대상과 바인딩 소스를 연결합니다.As illustrated by the above figure, data binding is essentially the bridge between your binding target and your binding source. 그림에서는 다음 기본 WPFWPF 데이터 바인딩 개념을 보여 줍니다.The figure demonstrates the following fundamental WPFWPF data binding concepts:

  • 일반적으로 각 바인딩에는 네 가지 구성 요소인 바인딩 대상 개체, 대상 속성, 바인딩 소스 및 사용할 바인딩 소스의 값 경로가 있습니다.Typically, each binding has these four components: a binding target object, a target property, a binding source, and a path to the value in the binding source to use. 콘텐츠를 바인딩할 경우 등는 TextBox이름 속성은 직원 대상 개체는 개체는 TextBox, target 속성이 Text 속성을 사용 하 여 값은 이름, 원본 개체와 직원 개체입니다.For example, if you want to bind the content of a TextBox to the Name property of an Employee object, your target object is the TextBox, the target property is the Text property, the value to use is Name, and the source object is the Employee object.

  • 대상 속성은 종속성 속성이어야 합니다.The target property must be a dependency property. 대부분 UIElement 속성은 종속성 속성 및 읽기 전용 것을 제외한 대부분의 종속성 속성을 기본적으로 데이터 바인딩을 지원 합니다.Most UIElement properties are dependency properties and most dependency properties, except read-only ones, support data binding by default. (만 DependencyObject 종속성 속성 및 모든 형식을 정의할 수 UIElement에서 파생 DependencyObject.)(Only DependencyObject types can define dependency properties and all UIElements derive from DependencyObject.)

  • 그림에는 지정되지 않았지만 바인딩 소스 개체는 사용자 지정 CLRCLR 개체로 제한되지 않습니다.Although not specified in the figure, it should be noted that the binding source object is not restricted to being a custom CLRCLR object. WPFWPF 데이터 바인딩은 CLRCLR 개체 및 XMLXML 형식의 데이터를 지원합니다. data binding supports data in the form of CLRCLR objects and XMLXML. 바인딩 소스 몇 가지 예를 제공 하는 것을 UIElement, 목록 개체는 CLRCLR 연결 된 개체에 ADO.NETADO.NET 데이터 또는 웹 서비스 또는 들어 있는 XmlNode 프로그램 XMLXML 데이터입니다.To provide some examples, your binding source may be a UIElement, any list object, a CLRCLR object that is associated with ADO.NETADO.NET data or Web Services, or an XmlNode that contains your XMLXML data. 자세한 내용은 바인딩 소스 개요를 참조하세요.For more information, see Binding Sources Overview.

다른 SDK(소프트웨어 개발 키트)software development kit (SDK) 항목을 읽을 때 바인딩을 설정하고 있다면 바인딩 소스 바인딩 대상을 바인딩하고 있다는 것을 기억하세요.As you read through other SDK(소프트웨어 개발 키트)software development kit (SDK) topics, it is important to remember that when you are establishing a binding, you are binding a binding target to a binding source. 예를 들어, 일부 내부 표시 하는 경우 XMLXML 의 데이터는 ListBox 바인딩하는 데이터 바인딩을 사용 하 여, 프로그램 ListBoxXMLXML 데이터입니다.For example, if you are displaying some underlying XMLXML data in a ListBox using data binding, you are binding your ListBox to the XMLXML data.

사용 하면 바인딩을 설정 하는 Binding 개체입니다.To establish a binding, you use the Binding object. 이 항목의 나머지 부분에서는 다양 한 관련 된 개념 및 일부 속성 및 사용에 설명 된 Binding 개체입니다.The rest of this topic discusses many of the concepts associated with and some of the properties and usage of the Binding object.

데이터 흐름 방향Direction of the Data Flow

바인딩 소스에 바인딩 대상에서 바인딩 데이터 흐름 이동할 수 설명한 것 처럼 및 위 그림에 화살표로 표시 됨 (사용자의 값을 편집 하는 경우이 소스 값이 변경 되는 예를 들어 한 TextBox) 및/또는 바인딩 소스에서 바인딩 대상 (예를 들어 프로그램 TextBox 콘텐츠 바인딩 소스에서 변경 내용으로 업데이트) 하 여 바인딩 소스에 적절 한 알림을 제공 하는 경우.As mentioned previously and as indicated by the arrow in the figure above, the data flow of a binding can go from the binding target to the binding source (for example, the source value changes when a user edits the value of a TextBox) and/or from the binding source to the binding target (for example, your TextBox content gets updated with changes in the binding source) if the binding source provides the proper notifications.

응용 프로그램에서 사용자가 데이터를 변경하고 다시 소스 개체에 전파할 수 있도록 해야 할 수 있습니다.You may want your application to enable users to change the data and propagate it back to the source object. 또는 사용자가 소스 데이터를 업데이트할 수 없도록 해야 할 수 있습니다.Or you may not want to enable users to update the source data. 설정 하 여이 제어할 수 있습니다는 Mode 속성의 프로그램 Binding 개체입니다.You can control this by setting the Mode property of your Binding object. 다음 그림은 다양한 유형의 데이터 흐름을 보여 줍니다.The following figure illustrates the different types of data flow:

데이터 바인딩 데이터 흐름Data binding data flow

  • OneWay 바인딩에서는 변경 내용이 자동으로 대상 속성을 업데이트 하려면 소스 속성에 있지만 대상 속성에 대 한 변경 내용을 원본 속성에 다시 전파 되지 않습니다.OneWay binding causes changes to the source property to automatically update the target property, but changes to the target property are not propagated back to the source property. 이 바인딩 유형은 바인드되는 컨트롤이 암시적으로 읽기 전용인 경우에 적합합니다.This type of binding is appropriate if the control being bound is implicitly read-only. 예를 들어 주식 시세표시기와 같은 원본에 바인드할 수 있거나 대상 속성에는 테이블의 데이터 바인딩된 배경색과 같이 변경을 위해 제공된 컨트롤 인터페이스가 없을 수 있습니다.For instance, you may bind to a source such as a stock ticker or perhaps your target property has no control interface provided for making changes, such as a data-bound background color of a table. 대상 속성의 변경 내용을 모니터링할 필요가 없는 경우 OneWay 바인딩 모드를 사용하면 TwoWay 바인딩 모드의 오버헤드가 방지됩니다.If there is no need to monitor the changes of the target property, using the OneWay binding mode avoids the overhead of the TwoWay binding mode.

  • TwoWay 바인딩에서는 원본 속성 또는 자동으로 다른 업데이트에 대 한 대상 속성을 변경 합니다.TwoWay binding causes changes to either the source property or the target property to automatically update the other. 이 바인딩 유형은 편집 가능한 폼이나 기타 완전한 대화형 UIUI 시나리오에 적합합니다.This type of binding is appropriate for editable forms or other fully-interactive UIUI scenarios. 대부분의 속성을 기본값 OneWay 바인딩, 하지만 일부 종속성 속성 (일반적으로 같은 사용자가 편집 가능한 컨트롤의 속성을는 Text 의 속성 TextBoxIsChecked 의 속성 CheckBox) 기본값으로TwoWay 바인딩.Most properties default to OneWay binding, but some dependency properties (typically properties of user-editable controls such as the Text property of TextBox and the IsChecked property of CheckBox) default to TwoWay binding. 종속성 속성이 기본적으로 단방향 또는 양방향으로 바인드되는지를 프로그래밍 방식으로 결정하려면 GetMetadata를 사용하여 속성의 속성 메타데이터를 가져온 후 BindsTwoWayByDefault 속성의 부울 값을 확인합니다.A programmatic way to determine whether a dependency property binds one-way or two-way by default is to get the property metadata of the property using GetMetadata and then check the Boolean value of the BindsTwoWayByDefault property.

  • OneWayToSource 반대 OneWay 바인딩; 원본 속성이 업데이트 대상 속성이 변경 될 때입니다.OneWayToSource is the reverse of OneWay binding; it updates the source property when the target property changes. UIUI에서 소스 값을 다시 평가하면 되는 경우가 한 가지 예제 시나리오입니다.One example scenario is if you only need to re-evaluate the source value from the UIUI.

  • 그림에서 설명 하지는 OneTime 바인딩 대상 속성을 초기화 한 source 속성 때문에 있지만 후속 변경 내용이 전파 되지 않습니다.Not illustrated in the figure is OneTime binding, which causes the source property to initialize the target property, but subsequent changes do not propagate. 이는 데이터 컨텍스트가 변경되고 있거나 데이터 컨텍스트의 개체가 변경될 경우 변경 내용이 대상 속성에 반영되지 않습니다.This means that if the data context undergoes a change or the object in the data context changes, then the change is not reflected in the target property. 이 바인딩 유형은 현재 상태의 스냅숏이 사용하기에 적절하거나 데이터가 실제로 정적인 상황에서 데이터를 사용하는 경우에 적합합니다.This type of binding is appropriate if you are using data where either a snapshot of the current state is appropriate to use or the data is truly static. 또한 이 바인딩 유형은 원본 속성의 일부 값으로 대상 속성을 초기화하려고 하며 데이터 컨텍스트가 사전에 알려지지 않은 경우에도 유용합니다.This type of binding is also useful if you want to initialize your target property with some value from a source property and the data context is not known in advance. 이는 기본적으로 원본 값이 변경되지 않은 경우에 더 나은 성능을 제공하는 OneWay 바인딩의 더 간단한 형태입니다.This is essentially a simpler form of OneWay binding that provides better performance in cases where the source value does not change.

소스 변경 내용을 검색 하려면 해당 (적용할 OneWayTwoWay 바인딩), 소스와 같은 적절 한 속성 변경 알림 메커니즘을 구현 해야 INotifyPropertyChanged합니다.Note that to detect source changes (applicable to OneWay and TwoWay bindings), the source must implement a suitable property change notification mechanism such as INotifyPropertyChanged. 참조 속성 변경 알림을 구현 의 예는 INotifyPropertyChanged 구현 합니다.See Implement Property Change Notification for an example of an INotifyPropertyChanged implementation.

Mode 속성 페이지에서는 바인딩 모드와 바인딩 방향을 지정 하는 방법의 예에 대 한 자세한 정보를 제공 합니다.The Mode property page provides more information about binding modes and an example of how to specify the direction of a binding.

소스 업데이트를 트리거하는 항목What Triggers Source Updates

바인딩 TwoWay 또는 OneWayToSource 대상 속성에 대 한 변경 내용을 수신 대기 하 고 소스 전파 합니다.Bindings that are TwoWay or OneWayToSource listen for changes in the target property and propagate them back to the source. 이를 소스 업데이트라고 합니다.This is known as updating the source. 예를 들어 TextBox의 텍스트를 편집하여 기본 소스 값을 변경할 수 있습니다.For example, you may edit the text of a TextBox to change the underlying source value. 데이터 흐름의 방향을 값에 의해 결정 됩니다 마지막 섹션에서 설명한는 Mode 바인딩의 속성입니다.As described in the last section, the direction of the data flow is determined by the value of the Mode property of the binding.

하지만 텍스트를 편집하는 동안이나 텍스트 편집을 마치고 마우스를 TextBox 외부로 이동한 후 소스 값이 업데이트될까요?However, does your source value get updated while you are editing the text or after you finish editing the text and point your mouse away from the TextBox? UpdateSourceTrigger 바인딩의 속성 원본의 업데이트를 트리거할 항목을 결정 합니다.The UpdateSourceTrigger property of the binding determines what triggers the update of the source. 다음 그림에서 오른쪽 화살표의 점의 역할을 보여 줍니다.는 UpdateSourceTrigger 속성:The dots of the right arrows in the following figure illustrate the role of the UpdateSourceTrigger property:

UpdateSourceTrigger 다이어그램UpdateSourceTrigger diagram

경우는 UpdateSourceTrigger 값은 PropertyChanged, 값에 의해 가리킵니다의 오른쪽 화살표 TwoWay 또는 OneWayToSource 바인딩 대상 속성이 변경 되는 즉시 업데이트 됩니다.If the UpdateSourceTrigger value is PropertyChanged, then the value pointed to by the right arrow of TwoWay or the OneWayToSource bindings gets updated as soon as the target property changes. 그러나 경우는 UpdateSourceTrigger 값은 LostFocus, 후 해당 값만 가져옵니다 업데이트 새 값으로 대상 속성 포커스를 잃을 때.However, if the UpdateSourceTrigger value is LostFocus, then that value only gets updated with the new value when the target property loses focus.

비슷합니다는 Mode 속성을 다른 종속성 속성에는 서로 다른 기본 UpdateSourceTrigger 값입니다.Similar to the Mode property, different dependency properties have different default UpdateSourceTrigger values. 대부분의 종속성 속성에 대한 기본값이 PropertyChanged인 반면 Text 속성의 기본값은 LostFocus입니다.The default value for most dependency properties is PropertyChanged, while the Text property has a default value of LostFocus. 즉, 소스 업데이트 될 때마다 수행 하는 이것으로 충분 하는 대상 속성이 변경 CheckBoxes 및 다른 단순 컨트롤입니다.This means that source updates usually happen whenever the target property changes, which is fine for CheckBoxes and other simple controls. 하지만 텍스트 필드의 경우 키 입력이 있을 때마다 업데이트하면 성능이 저하될 수 있고 새 값으로 커밋하기 전에 사용자가 백스페이스 키를 누르고 입력 오류를 수정할 수 있는 기회가 사라집니다.However, for text fields, updating after every keystroke can diminish performance and it denies the user the usual opportunity to backspace and fix typing errors before committing to the new value. 바로 이러한 이유로 Text 속성의 기본값은 LostFocus 대신 PropertyChanged합니다.That is why the Text property has a default value of LostFocus instead of PropertyChanged.

참조는 UpdateSourceTrigger 기본값을 확인 하는 방법에 대 한 정보에 대 한 속성 페이지 UpdateSourceTrigger 종속성 속성의 값입니다.See the UpdateSourceTrigger property page for information about how to find the default UpdateSourceTrigger value of a dependency property.

다음 표에서 각각에 대 한 예제 시나리오에서는 UpdateSourceTrigger 를 사용 하 여 값의 TextBox 예:The following table provides an example scenario for each UpdateSourceTrigger value using the TextBox as an example:

UpdateSourceTrigger 값UpdateSourceTrigger value 소스 값이 업데이트될 때When the Source Value Gets Updated TextBox의 예제 시나리오Example Scenario for TextBox
LostFocus (에 대 한 기본 TextBox.Text)LostFocus (default for TextBox.Text) TextBox 컨트롤이 포커스를 잃을 때When the TextBox control loses focus A TextBox 유효성 검사 논리와 연결 된 (데이터 유효성 검사 섹션 참조)A TextBox that is associated with validation logic (see Data Validation section)
PropertyChangedPropertyChanged 에 입력으로 TextBoxAs you type into the TextBox TextBox 대화방 창에서 컨트롤TextBox controls in a chat room window
명시적 방법Explicit 응용 프로그램 호출 하는 경우 UpdateSourceWhen the application calls UpdateSource TextBox (제출 단추를 클릭할 때에 소스 값을 업데이트) 편집 가능한 폼의 컨트롤TextBox controls in an editable form (updates the source values only when the user clicks the submit button)

예제를 보려면 TextBox 텍스트의 소스를 업데이트하는 시점 제어를 참조하세요.For an example, see Control When the TextBox Text Updates the Source.

바인딩 만들기Creating a Binding

이전 섹션에 설명 된 개념 중 일부를 만들며, 바인딩 사용 설정에서 Binding 개체 및 각 바인딩에 일반적으로 4 구성: 대상, 대상 속성, 바인딩 소스 및 경로 사용 하려면 소스 값에 바인딩.To recapitulate some of the concepts discussed in the previous sections, you establish a binding using the Binding object, and each binding usually has four components: binding target, target property, binding source, and a path to the source value to use. 이 섹션에서는 바인딩을 설정하는 방법을 설명합니다.This section discusses how to set up a binding.

바인딩 소스 개체가 SDKSample 네임스페이스에 정의된 MyData 클래스인 다음 예제를 살펴볼 수 있습니다.Consider the following example, in which the binding source object is a class named MyData that is defined in the SDKSample namespace. 설명을 위해 MyData 클래스에는 값이 "Red"로 설정된 ColorName 문자열 속성이 있습니다.For demonstration purposes, MyData class has a string property named ColorName, of which the value is set to "Red". 따라서 이 예제에서는 빨간색 배경이 있는 단추를 생성합니다.Thus, this example generates a button with a red background.

<DockPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:SDKSample">
  <DockPanel.Resources>
    <c:MyData x:Key="myDataSource"/>
  </DockPanel.Resources>
  <DockPanel.DataContext>
    <Binding Source="{StaticResource myDataSource}"/>
  </DockPanel.DataContext>
  <Button Background="{Binding Path=ColorName}"
          Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel>

바인딩 선언 구문에 대한 자세한 설명과 코드에서 바인딩을 설정하는 방법의 예제는 바인딩 선언 개요를 참조하세요.For more details on the binding declaration syntax and for examples of how to set up a binding in code, see Binding Declarations Overview.

이 예제를 기본 다이어그램에 적용하면 결과 그림은 다음과 같이 표시됩니다.If we apply this example to our basic diagram, the resulting figure looks like the following. 이 한 OneWay Background 속성을 지원 하기 때문에 바인딩 OneWay 기본적으로 바인딩.This is a OneWay binding because the Background property supports OneWay binding by default.

데이터 바인딩 다이어그램Data binding diagram

작동 하는 이유가 하더라도 궁금할는 ColorName 하는 동안 형식 문자열의 속성은는 Background 속성은 형식이 Brush합니다.You may wonder why this works even though the ColorName property is of type string while the Background property is of type Brush. 기본 형식 변환이 작동하기 때문이고 이 기능은 데이터 변환 섹션에서 설명합니다.This is default type conversion at work and is discussed in the Data Conversion section.

바인딩 소스 지정Specifying the Binding Source

이전 예제에서 바인딩 소스로 설정 하 여 지정 됩니다는 DataContext 속성에는 DockPanel 요소입니다.Notice that in the previous example, the binding source is specified by setting the DataContext property on the DockPanel element. Button 다음 상속는 DataContext 에서 값의 DockPanel, 부모 요소는 합니다.The Button then inherits the DataContext value from the DockPanel, which is its parent element. 다시 말하지만, 바인딩 소스 개체는 바인딩의 네 가지 필수 구성 요소 중 하나입니다.To reiterate, the binding source object is one of the four necessary components of a binding. 따라서 바인딩 소스 개체를 지정하지 않으면 바인딩은 아무 작업도 하지 않습니다.Therefore, without the binding source object being specified, the binding would do nothing.

바인딩 소스 개체를 지정하는 여러 가지 방법이 있습니다.There are several ways to specify the binding source object. 사용 하 여 DataContext 부모 요소에 대해 속성은 여러 속성 동일한 소스에 바인딩하는 경우 유용 합니다.Using the DataContext property on a parent element is useful when you are binding multiple properties to the same source. 하지만 개별 바인딩 선언에서 바인딩 소스를 지정하는 방법이 더 적절한 경우도 있습니다.However, sometimes it may be more appropriate to specify the binding source on individual binding declarations. 이전 예제를 사용 하는 대신는 DataContext 속성을 설정 하 여 바인딩 소스를 지정할 수 있습니다는 Source 다음 예제와 같이 단추의 바인딩 선언에서 직접 속성:For the previous example, instead of using the DataContext property, you can specify the binding source by setting the Source property directly on the binding declaration of the button, as in the following example:

<DockPanel.Resources>
  <c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"
        Background="{Binding Source={StaticResource myDataSource},
                             Path=ColorName}">I am bound to be RED!</Button>

아닌 다른 설정의 DataContext 속성 요소에 직접, 상속 하는 DataContext (예: 단추 첫 번째 예제에서)를 상위 항목에서 값 및 명시적으로 설정 하 여 바인딩 소스를 지정 하는 Source 는 속성Binding (예: 단추 마지막 예제)를 사용할 수도 있습니다는 ElementName 속성 또는 RelativeSource 속성을 바인딩 소스를 지정 합니다.Other than setting the DataContext property on an element directly, inheriting the DataContext value from an ancestor (such as the button in the first example), and explicitly specifying the binding source by setting the Source property on the Binding (such as the button the last example), you can also use the ElementName property or the RelativeSource property to specify the binding source. ElementName 속성은 단추의 너비를 조정 하려면 슬라이더를 사용할 경우 같은 응용 프로그램에서 다른 요소에 바인딩하는 경우 유용 합니다.The ElementName property is useful when you are binding to other elements in your application, such as when you are using a slider to adjust the width of a button. RelativeSource 에 바인딩이 지정 되는 경우 속성이 유용 합니다.는 ControlTemplate 또는 Style합니다.The RelativeSource property is useful when the binding is specified in a ControlTemplate or a Style. 자세한 내용은 바인딩 소스 지정을 참조하세요.For more information, see Specify the Binding Source.

값 경로 지정Specifying the Path to the Value

사용 하 여 바인딩 소스 개체 이면의 Path 속성을 통해 바인딩에 사용할 값을 지정 합니다.If your binding source is an object, you use the Path property to specify the value to use for your binding. 바인딩하는 경우 XMLXML 사용 데이터는 XPath 속성 값을 지정 합니다.If you are binding to XMLXML data, you use the XPath property to specify the value. 경우에 따라 사용 하도록 적용할 수는 Path 속성 데이터를 가져온 경우에 XMLXML합니다.In some cases, it may be applicable to use the Path property even when your data is XMLXML. 예를 들어 XPath 쿼리) (결과로 반환 된 XmlNode의 Name 속성에 액세스 하려는 경우 사용 해야는 Path 속성 외에 XPath 속성입니다.For example, if you want to access the Name property of a returned XmlNode (as a result of an XPath query), you should use the Path property in addition to the XPath property.

구문 정보 및 예제에 대 한 참조는 PathXPath 속성 페이지.For syntax information and examples, see the Path and XPath property pages.

강조 했지만 하지만 Path 사용할 값에는 전체 개체에 바인딩하려는 경우에는 바인딩의 4 개의 필수 구성 요소 중 하나 이면 사용할 값을는 바인딩 소스 개체와 동일 합니다.Note that although we have emphasized that the Path to the value to use is one of the four necessary components of a binding, in the scenarios which you want to bind to an entire object, the value to use would be the same as the binding source object. 이 경우 지정 하지에 적용 됩니다는 Path합니다.In those cases, it is applicable to not specify a Path. 다음 예제를 참조하세요.Consider the following example:

<ListBox ItemsSource="{Binding}"
         IsSynchronizedWithCurrentItem="true"/>

위의 예제에서는 빈 바인딩 구문인 {Binding}을 사용합니다.The above example uses the empty binding syntax: {Binding}. 이 경우에 ListBox DataContext (이 예제에 표시 되지 않음) 부모 DockPanel 요소 로부터 상속 받습니다.In this case, the ListBox inherits the DataContext from a parent DockPanel element (not shown in this example). 경로를 지정하지 않으면 기본적으로 전체 개체에 바인딩됩니다.When the path is not specified, the default is to bind to the entire object. 즉,이 예제에서는 경로 생략 되었습니다 바인딩하는 것 때문에 ItemsSource 전체 개체 속성입니다.In other words, in this example, the path has been left out because we are binding the ItemsSource property to the entire object. 자세한 내용은 컬렉션에 바인딩 섹션을 참조하세요.(See the Binding to Collections section for an in-depth discussion.)

컬렉션에 바인딩 외에 개체의 단일 속성만이 아닌 전체 개체에 바인딩하려는 경우에도 이 시나리오가 유용합니다.Other than binding to a collection, this scenario is also useful when you want to bind to an entire object instead of just a single property of an object. 예를 들면 소스 개체가 문자열 형식이고 문자열 자체에 바인딩하려는 경우입니다.For example, if your source object is of type string and you simply want to bind to the string itself. 또 다른 일반적인 시나리오는 여러 속성이 있는 개체에 요소를 바인딩하려는 경우입니다.Another common scenario is when you want to bind an element to an object with several properties.

바인딩된 대상 속성에서 데이터가 의미를 가지려면 사용자 지정 논리를 적용해야 할 수 있습니다.Note that you may need to apply custom logic so that the data is meaningful to your bound target property. 사용자 지정 논리는 사용자 지정 변환기 형식일 수 있습니다(기본 형식 변환이 없는 경우).The custom logic may be in the form of a custom converter (if default type conversion does not exist). 변환기에 대한 자세한 내용은 데이터 변환을 참조하세요.See Data Conversion for information about converters.

Binding 및 BindingExpressionBinding and BindingExpression

다른 기능 및 데이터 바인딩 사용을 가져오기 전에 소개 하기 위한 유용한 것은 BindingExpression 클래스입니다.Before getting into other features and usages of data binding, it would be useful to introduce the BindingExpression class. 이전 섹션에서 설명한 것 처럼는 Binding 클래스는 바인딩; 선언에 대 한 높은 수준의 클래스는 Binding 클래스 바인딩 특성을 지정할 수 있는 여러 속성을 제공 합니다.As you have seen in previous sections, the Binding class is the high-level class for the declaration of a binding; the Binding class provides many properties that allow you to specify the characteristics of a binding. 관련된 클래스 BindingExpression, 원본과 대상 간의 연결을 유지 하는 기본 개체입니다.A related class, BindingExpression, is the underlying object that maintains the connection between the source and the target. 바인딩에는 여러 바인딩 식에서 공유될 수 있는 모든 정보가 포함됩니다.A binding contains all the information that can be shared across several binding expressions. A BindingExpression 공유할 수 없는 인스턴스 식의 모든 인스턴스 정보를 포함 하는 Binding합니다.A BindingExpression is an instance expression that cannot be shared and contains all the instance information of the Binding.

예를 들어 다음을 있는 myDataObject 의 인스턴스가 MyData 클래스 myBinding 원본인 Binding 개체 및 MyData 클래스는 문자열 속성을 포함 하는 정의 된 클래스 MyDataProperty합니다.For example, consider the following, where myDataObject is an instance of MyData class, myBinding is the source Binding object, and MyData class is a defined class that contains a string property named MyDataProperty. 텍스트 내용을 바인딩하는이 예제 mytext, 인스턴스의 TextBlockMyDataProperty합니다.This example binds the text content of mytext, an instance of TextBlock, to MyDataProperty.

// Make a new source.
MyData myDataObject = new MyData(DateTime.Now);      
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
// Bind the new data source to the myText TextBlock control's Text dependency property.
myText.SetBinding(TextBlock.TextProperty, myBinding);
' Make a new source.
Dim data1 As New MyData(DateTime.Now)
Dim binding1 As New Binding("MyDataProperty")
binding1.Source = data1
' Bind the new data source to the myText TextBlock control's Text dependency property.
Me.myText.SetBinding(TextBlock.TextProperty, binding1)

같은 myBinding 개체를 사용하여 다른 바인딩을 만들 수 있습니다.You can use the same myBinding object to create other bindings. 예를 들어 myBinding 개체를 사용하여 확인란의 텍스트 컨텍스트를 MyDataProperty에 바인딩할 수 있습니다.For example, you may use myBinding object to bind the text content of a check box to MyDataProperty. 이 시나리오의 두 인스턴스 됩니다 BindingExpression 공유는 myBinding 개체입니다.In that scenario, there will be two instances of BindingExpression sharing the myBinding object.

A BindingExpression 호출의 반환 값을 통해 개체를 가져올 수 GetBindingExpression 데이터 바인딩된 개체에 있습니다.A BindingExpression object can be obtained through the return value of calling GetBindingExpression on a data-bound object. 다음 항목에서는 설명의 사용 중 일부는 BindingExpression 클래스:The following topics demonstrate some of the usages of the BindingExpression class:

데이터 변환Data Conversion

이전 예에서 단추는 빨간색 때문에 해당 Background 속성 값이 "Red"는 문자열 속성에 바인딩되어 있습니다.In the previous example, the button is red because its Background property is bound to a string property with the value "Red". 에 형식 변환기가 하므로이 작업이 Brush 문자열 값을 변환할 대상 형식은 Brush합니다.This works because a type converter is present on the Brush type to convert the string value to a Brush.

바인딩 만들기 섹션의 그림에 이 정보를 추가하려는 경우 다이어그램은 다음과 같이 표시됩니다.To add this information to the figure in the Creating a Binding section, the diagram looks like the following:

데이터 바인딩 다이어그램Data binding diagram

그러나,이 경우 어떻게 하는 대신 바인딩 소스 개체에 형식 문자열의 속성을 형식의 속성이 Color?However, what if instead of having a property of type string your binding source object has a Color property of type Color? 이 경우 작동 하도록 바인딩을 위해 해야 처음 설정 하는 항목으로 속성 값 하는 Background 속성은 허용 합니다.In that case, in order for the binding to work you would need to first turn the Color property value into something that the Background property accepts. 사용자 지정 변환기를 구현 하 여 만들 해야는 IValueConverter 다음 예제와 같이 인터페이스:You would need to create a custom converter by implementing the IValueConverter interface, as in the following example:

[ValueConversion(typeof(Color), typeof(SolidColorBrush))]
public class ColorBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Color color = (Color)value;
        return new SolidColorBrush(color);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
<ValueConversion(GetType(Color), GetType(SolidColorBrush))>
Public Class ColorBrushConverter
	Implements IValueConverter
	Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
		Dim color As Color = CType(value, Color)
		Return New SolidColorBrush(color)
	End Function

	Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
		Return Nothing
	End Function
End Class

IValueConverter 참조 페이지는 자세한 정보를 제공 합니다.The IValueConverter reference page provides more information.

이제 기본 변환 대신 사용자 지정 변환기가 사용되고 다이어그램이 다음과 같이 표시됩니다.Now the custom converter is used instead of default conversion, and our diagram looks like this:

데이터 바인딩 다이어그램Data binding diagram

다시 말하지만, 바인딩되는 형식에 있는 형식 변환기 때문에 기본 변환을 사용할 수 있습니다.To reiterate, default conversions may be available because of type converters that are present in the type being bound to. 이 동작은 대상에서 사용할 수 있는 형식 변환기에 따라 결정됩니다.This behavior will depend on which type converters are available in the target. 확실하지 않으면 사용자 지정 변환기를 만듭니다.If in doubt, create your own converter.

데이터 변환기를 구현하는 것이 좋은 몇 가지 일반적인 시나리오는 다음과 같습니다.Following are some typical scenarios where it makes sense to implement a data converter:

  • 데이터를 문화권에 따라 다르게 표시해야 하는 경우.Your data should be displayed differently, depending on culture. 예를 들어 특정 문화권에서 사용되는 값 또는 표준에 따라 통화 변환기 또는 달력 날짜/시간 변환기를 구현해야 할 수 있습니다.For instance, you might want to implement a currency converter or a calendar date/time converter based on the values or standards used in a particular culture.

  • 사용되는 데이터가 반드시 속성의 텍스트 값을 변경하는 데 사용될 필요는 없지만, 이미지의 소스 또는 표시 텍스트의 색이나 스타일과 같은 몇 가지 다른 값을 변경하는 데 사용되는 경우.The data being used is not necessarily intended to change the text value of a property, but is instead intended to change some other value, such as the source for an image, or the color or style of the display text. 텍스트 필드를 표 셀의 Background 속성에 바인딩하는 것과 같이 적절해 보이지 않는 속성의 바인딩을 변환하는 방식으로 이 인스턴스에서 변환기를 사용할 수 있습니다.Converters can be used in this instance by converting the binding of a property that might not seem to be appropriate, such as binding a text field to the Background property of a table cell.

  • 두 개 이상의 컨트롤 또는 컨트롤의 여러 속성이 같은 데이터에 바인딩됩니다.More than one control or to multiple properties of controls are bound to the same data. 이 경우 기본 바인딩은 텍스트만 표시할 수 있는 반면, 기타 바인딩은 특정 표시 문제를 처리하지만 소스 정보와 같은 바인딩을 사용합니다.In this case, the primary binding might just display the text, whereas other bindings handle specific display issues but still use the same binding as source information.

  • 지금까지 하지 아직 설명한 MultiBinding, 대상 속성에 바인딩의 컬렉션이 있습니다.So far we have not yet discussed MultiBinding, where a target property has a collection of bindings. 경우에 MultiBinding, 사용자 지정을 사용 하 여 IMultiValueConverter 바인딩의 값의 최종 값을 생성 합니다.In the case of a MultiBinding, you use a custom IMultiValueConverter to produce a final value from the values of the bindings. 예를 들어 빨간색, 파란색 및 녹색 값을 기준으로 색을 계산할 수 있고 이러한 값은 같거나 다른 바인딩 소스 개체의 값일 수 있습니다.For example, color may be computed from red, blue, and green values, which can be values from the same or different binding source objects. 참조는 MultiBinding 예제와 정보에 대 한 클래스 페이지입니다.See the MultiBinding class page for examples and information.

컬렉션에 바인딩Binding to Collections

바인딩 소스는 속성에 데이터가 포함된 단일 개체로 처리되거나 종종 함께 그룹화되는 다형 개체의 데이터 컬렉션(예: 데이터베이스에 대한 쿼리의 결과)으로 처리될 수 있습니다.A binding source object can be treated either as a single object of which the properties contain data or as a data collection of polymorphic objects that are often grouped together (such as the result of a query to a database). 지금까지 단일 개체에 대한 바인딩만 설명했지만 일반적인 시나리오는 데이터 컬렉션에 대한 바인딩입니다.So far we've only discussed binding to single objects, however, binding to a data collection is a common scenario. 일반적인 시나리오를 사용 하는 예를 들어는 ItemsControl 와 같은 한 ListBox, ListView, 또는 TreeView 에 표시 된 응용 프로그램에서 같은 데이터 컬렉션을 표시 하는 데이터 바인딩의? 섹션.For example, a common scenario is to use an ItemsControl such as a ListBox, ListView, or TreeView to display a data collection, such as in the application shown in the What Is Data Binding? section.

다행히도 기본 다이어그램이 적용됩니다.Fortunately, our basic diagram still applies. 바인딩하는 경우는 ItemsControl 를 컬렉션에 다이어그램은 다음과 같습니다.If you are binding an ItemsControl to a collection, the diagram looks like this:

데이터 바인딩 ItemsControl 다이어그램Data binding ItemsControl diagram

바인딩할이 다이어그램에 나와 있는 것 처럼는 ItemsControl 컬렉션 개체에 ItemsSource 속성은 사용 하는 속성입니다.As shown in this diagram, to bind an ItemsControl to a collection object, ItemsSource property is the property to use. 생각할 수 있으며 ItemsSource 속성의 내용으로는 ItemsControl합니다.You can think of ItemsSource property as the content of the ItemsControl. 바인딩은 참고 OneWay 때문에 ItemsSource 속성은 지원 OneWay 기본적으로 바인딩.Note that the binding is OneWay because the ItemsSource property supports OneWay binding by default.

컬렉션을 구현하는 방법How to Implement Collections

구현 하는 컬렉션을 열거할 수는 IEnumerable 인터페이스입니다.You can enumerate over any collection that implements the IEnumerable interface. 그러나 삽입 또는 삭제 컬렉션에서 업데이트할 수 있도록 동적 바인딩을 설정 하는 UIUI 컬렉션은 자동으로 구현 해야 합니다는 INotifyCollectionChanged 인터페이스입니다.However, to set up dynamic bindings so that insertions or deletions in the collection update the UIUI automatically, the collection must implement the INotifyCollectionChanged interface. 이 인터페이스는 기본 컬렉션이 변경될 때마다 발생해야 하는 이벤트를 노출합니다.This interface exposes an event that should be raised whenever the underlying collection changes.

WPFWPF 제공 된 ObservableCollection<T> 클래스를 노출 하는 데이터 컬렉션을 구현 하는 기본 제공는 INotifyCollectionChanged 인터페이스입니다. provides the ObservableCollection<T> class, which is a built-in implementation of a data collection that exposes the INotifyCollectionChanged interface. 완전 하 게 지원 대상에 소스 개체의 현재 전송 데이터 값을 지 원하는 바인딩 가능한 속성 컬렉션에 있는 각 개체 구현 해야 참고는 INotifyPropertyChanged 인터페이스입니다.Note that to fully support transferring data values from source objects to targets, each object in your collection that supports bindable properties must also implement the INotifyPropertyChanged interface. 자세한 내용은 바인딩 소스 개요를 참조하세요.For more information, see Binding Sources Overview.

고유한 컬렉션을 구현 하기 전에 사용 하 여 것이 좋습니다 ObservableCollection<T> 또는 같은 기존 컬렉션 중 하나가 클래스 List<T>, Collection<T>, 및 BindingList<T>, 다양 한 기타.Before implementing your own collection, consider using ObservableCollection<T> or one of the existing collection classes, such as List<T>, Collection<T>, and BindingList<T>, among many others. 고급 시나리오에 있고 컬렉션을 직접 구현 하는 것이 좋습니다를 사용 하 여 IList, 인덱스 및 최적의 성능을 개별적으로 액세스할 수 있는 개체의 제네릭이 아닌 컬렉션을 제공 하는 합니다.If you have an advanced scenario and want to implement your own collection, consider using IList, which provides a non-generic collection of objects that can be individually accessed by index and thus the best performance.

컬렉션 뷰Collection Views

한 번에 ItemsControl 에 바인딩된 데이터 컬렉션을 정렬, 필터링 또는 데이터를 그룹화 하는 것이 좋습니다.Once your ItemsControl is bound to a data collection, you may want to sort, filter, or group the data. 컬렉션 뷰를 구현 하는 클래스를 사용 하는 작업을 수행 하는 ICollectionView 인터페이스입니다.To do that, you use collection views, which are classes that implement the ICollectionView interface.

컬렉션 뷰란?What Are Collection Views?

컬렉션 뷰는 기본 소스 컬렉션 자체를 변경할 필요 없이 정렬, 필터 및 그룹화 쿼리에 따라 소스 컬렉션을 탐색하고 표시할 수 있는 바인딩 소스 컬렉션의 최상위에 있는 레이어입니다.A collection view is a layer on top of a binding source collection that allows you to navigate and display the source collection based on sort, filter, and group queries, without having to change the underlying source collection itself. 컬렉션 뷰에서는 컬렉션의 현재 항목에 대한 포인터도 유지 관리합니다.A collection view also maintains a pointer to the current item in the collection. 소스 컬렉션에서 구현 하는 경우는 INotifyCollectionChanged 인터페이스에 의해 발생 한 변경 내용을 CollectionChanged 이벤트 보기에 전파 됩니다.If the source collection implements the INotifyCollectionChanged interface, the changes raised by the CollectionChanged event are propagated to the views.

뷰는 기본 소스 컬렉션을 변경하지 않으므로 각 소스 컬렉션에는 연결된 여러 뷰가 있을 수 있습니다.Because views do not change the underlying source collections, each source collection can have multiple views associated with it. 예를 들어 Task 개체의 컬렉션이 있을 수 있습니다.For example, you may have a collection of Task objects. 뷰를 사용하여 같은 데이터를 다양한 방식으로 표시할 수 있습니다.With the use of views, you can display that same data in different ways. 예를 들어 페이지 왼쪽에는 우선 순위별로 정렬된 작업을 표시하고 오른쪽에는 영역별로 그룹화된 작업을 표시해야 할 수 있습니다.For example, on the left side of your page you may want to show tasks sorted by priority, and on the right side, grouped by area.

뷰를 만드는 방법How to Create a View

뷰를 만들고 사용하는 한 가지 방법은 뷰 개체를 인스턴스화하고 이를 바인딩 소스로 사용하는 것입니다.One way to create and use a view is to instantiate the view object directly and then use it as the binding source. 예를 들어 데이터 바인딩이란? 섹션에 나와 있는 Data Binding Demo(데이터 바인딩 데모) 응용 프로그램을 살펴보겠습니다.For example, consider the Data Binding Demo application shown in the What Is Data Binding? section. 구현 된 되도록는 ListBox 직접 데이터 수집 하는 대신 데이터 컬렉션에 대 한 뷰를 바인딩합니다.The application is implemented such that the ListBox binds to a view over the data collection instead of the data collection directly. 다음 예제는 Data Binding Demo(데이터 바인딩 데모) 응용 프로그램에서 추출됩니다.The following example is extracted from the Data Binding Demo application. CollectionViewSource 클래스는는 XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) 에서 상속 되는 클래스의 프록시 CollectionView합니다.The CollectionViewSource class is the XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) proxy of a class that inherits from CollectionView. 이 특정 예제는 Source 뷰의 바인딩된는 AuctionItems 컬렉션 (형식의 ObservableCollection<T>) 현재 응용 프로그램 개체입니다.In this particular example, the Source of the view is bound to the AuctionItems collection (of type ObservableCollection<T>) of the current application object.

<Window.Resources>
<CollectionViewSource 
      Source="{Binding Source={x:Static Application.Current}, Path=AuctionItems}"   
      x:Key="listingDataView" />
</Window.Resources>

리소스 listingDataView 등 역할 요소는 응용 프로그램에 대 한 바인딩 소스로 ListBox:The resource listingDataView then serves as the binding source for elements in the application, such as the ListBox:

<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">
</ListBox>

동일한 컬렉션에 대 한 다른 보기를 만들려면 다른 만들 수 있습니다 CollectionViewSource 인스턴스 하 고 다른 x:Key 이름입니다.To create another view for the same collection, you can create another CollectionViewSource instance and give it a different x:Key name.

다음 표에서 뷰 데이터 형식을 기본 컬렉션 뷰로 또는 만들어집니다 CollectionViewSource 소스 컬렉션 형식을 기반으로 합니다.The following table shows which view data types are created as the default collection view or by CollectionViewSource based on the source collection type.

소스 컬렉션 형식Source collection type 컬렉션 뷰 형식Collection view type 노트Notes
IEnumerable 내부 형식에 따라 CollectionViewAn internal type based on CollectionView 항목을 그룹화할 수 없습니다.Cannot group items.
IList ListCollectionView 가장 빠릅니다.Fastest.
IBindingList BindingListCollectionView
기본 뷰 사용Using a Default View

컬렉션 뷰를 만들고 사용하는 한 가지 방법은 컬렉션 뷰를 바인딩 소스로 지정하는 것입니다.Specifying a collection view as a binding source is one way to create and use a collection view. WPF에서도 바인딩 소스로 사용되는 모든 컬렉션에 대한 기본 컬렉션 뷰를 만듭니다.WPF also creates a default collection view for every collection used as a binding source. 컬렉션에 직접 바인딩할 경우 WPF는 기본 뷰에 바인딩됩니다.If you bind directly to a collection, WPF binds to its default view. 같은 컬렉션에 대한 모든 바인딩이 이 기본 뷰를 공유하므로 하나의 바인딩된 컨트롤이나 코드(예: 뒷부분에 설명되는 현재 항목 포인터에 대한 정렬 또는 변경)를 통해 기본 뷰에 적용된 변경 내용은 같은 컬렉션에 대한 모든 다른 바인딩에 반영됩니다.Note that this default view is shared by all bindings to the same collection, so a change made to a default view by one bound control or code (such as sorting or a change to the current item pointer, discussed later) is reflected in all other bindings to the same collection.

사용 하면 기본 보기를 가져오려면는 GetDefaultView 메서드.To get the default view, you use the GetDefaultView method. 예제를 보려면 데이터 수집의 기본 뷰 가져오기를 참조하세요.For an example, see Get the Default View of a Data Collection.

ADO.NET DataTable이 있는 컬렉션 뷰Collection Views with ADO.NET DataTables

성능을 향상 시키기 위해 ADO.NET에 대 한 컬렉션 뷰 DataTable 또는 DataView 개체 정렬 및 필터링을 대리자는 DataView합니다.To improve performance, collection views for ADO.NET DataTable or DataView objects delegate sorting and filtering to the DataView. 이렇게 하면 정렬 및 필터링이 데이터 소스의 모든 컬렉션 뷰에서 공유됩니다.This causes sorting and filtering to be shared across all collection views of the data source. 정렬 하 고 독립적으로 필터링 컬렉션 뷰를 사용 하도록 설정 하는 자체 컬렉션 뷰를 초기화 DataView 개체입니다.To enable each collection view to sort and filter independently, initialize each collection view with its own DataView object.

정렬Sorting

앞에서 설명한 대로 뷰에서는 컬렉션에 정렬 순서를 적용할 수 있습니다.As mentioned before, views can apply a sort order to a collection. 기본 컬렉션에 있는 데이터에는 관련 상속 순서가 있거나 없을 수도 있습니다.As it exists in the underlying collection, your data may or may not have a relevant, inherent order. 컬렉션에 대한 뷰를 통해 제공한 비교 기준에 따라 순서를 적용하거나 기본 순서를 변경할 수 있습니다.The view over the collection allows you to impose an order, or change the default order, based on comparison criteria that you supply. 이는 데이터의 클라이언트 기반 뷰이므로 일반적으로 열과 일치하는 값에 따라 표 형식 데이터의 열을 정렬해야 할 수 있습니다.Because it is a client-based view of the data, a common scenario is that the user might want to sort columns of tabular data per the value that the column corresponds to. 뷰를 사용하면 기본 컬렉션을 변경하거나 컬렉션 콘텐츠를 다시 쿼리할 필요 없이 이 사용자 기반 정렬을 적용할 수 있습니다.Using views, this user-driven sort can be applied, again without making any changes to the underlying collection or even having to requery for the collection content. 예제를 보려면 머리글을 클릭할 때 GridView 열 정렬을 참조하세요.For an example, see Sort a GridView Column When a Header Is Clicked.

다음 예제에서는 "Sort 범주 및 날짜"의 정렬 논리 CheckBox 응용 프로그램의 UIUI데이터 바인딩의? 섹션:The following example shows the sorting logic of the "Sort by category and date" CheckBox of the application UIUI in the What Is Data Binding? section:

private void AddSorting(object sender, RoutedEventArgs args)
{
    // This sorts the items first by Category and within each Category,
    // by StartDate. Notice that because Category is an enumeration,
    // the order of the items is the same as in the enumeration declaration
    listingDataView.SortDescriptions.Add(
        new SortDescription("Category", ListSortDirection.Ascending));
    listingDataView.SortDescriptions.Add(
        new SortDescription("StartDate", ListSortDirection.Ascending));
}
Private Sub AddSorting(ByVal sender As Object, ByVal args As RoutedEventArgs)
    'This sorts the items first by Category and within each Category, by StartDate
    'Notice that because Category is an enumeration, the order of the items is the same as in the 
    'enumeration declaration
    listingDataView.SortDescriptions.Add(New SortDescription("Category", ListSortDirection.Ascending))
    listingDataView.SortDescriptions.Add(New SortDescription("StartDate", ListSortDirection.Ascending))
End Sub

필터링Filtering

컬렉션에 필터를 적용할 수도 있습니다.Views can also apply a filter to a collection. 이는 항목이 컬렉션에 있을 수 있지만 이 특정 뷰는 전체 컬렉션의 특정 하위 집합만 표시하는 데 사용됨을 의미합니다.This means that although an item might exist in the collection, this particular view is intended to show only a certain subset of the full collection. 데이터에서 조건에 따라 필터링할 수 있습니다.You might filter on a condition in the data. 예를 들어, 응용 프로그램에서 단원의 데이터 바인딩의? 섹션 "표시만 세우고" CheckBox 하 여 가격이 $25 개 이상의 항목을 필터링 하기 위한 논리가 포함 합니다.For instance, as is done by the application in the What Is Data Binding? section, the "Show only bargains" CheckBox contains logic to filter out items that cost $25 or more. 설정 하려면 다음 코드를 실행 하는 ShowOnlyBargainsFilterFilter 이벤트 처리기 때는 CheckBox 선택:The following code is executed to set ShowOnlyBargainsFilter as the Filter event handler when that CheckBox is selected:

listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);
AddHandler listingDataView.Filter, AddressOf ShowOnlyBargainsFilter

ShowOnlyBargainsFilter 이벤트 처리기에는 다음과 같은 구현이 있습니다.The ShowOnlyBargainsFilter event handler has the following implementation:

private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
    AuctionItem product = e.Item as AuctionItem;
    if (product != null)
    {
        // Filter out products with price 25 or above
        if (product.CurrentPrice < 25)
        {
            e.Accepted = true;
        }
        else
        {
            e.Accepted = false;
        }
    }
}
Private Sub ShowOnlyBargainsFilter(ByVal sender As Object, ByVal e As FilterEventArgs)
    Dim product As AuctionItem = CType(e.Item, AuctionItem)
    If Not (product Is Nothing) Then
        'Filter out products with price 25 or above
        If product.CurrentPrice < 25 Then
            e.Accepted = True
        Else
            e.Accepted = False
        End If
    End If
End Sub

중 하나를 사용 하는 경우는 CollectionView 직접 대신의 클래스 CollectionViewSource를 사용 하 여는 Filter 속성을 통해는 콜백을 지정 합니다.If you are using one of the CollectionView classes directly instead of CollectionViewSource, you would use the Filter property to specify a callback. 예제를 보려면 뷰에서 데이터 필터링을 참조하세요.For an example, see Filter Data in a View.

그룹화Grouping

내부 클래스를 제외 하 고는 IEnumerable 컬렉션, 모든 컬렉션 뷰를 논리 그룹으로 컬렉션 뷰에서의 컬렉션을 분할할 수 있도록 그룹화의 기능을 지원 합니다.Except for the internal class that views an IEnumerable collection, all collection views support the functionality of grouping, which allows the user to partition the collection in the collection view into logical groups. 그룹은 사용자가 그룹 목록을 제공하는 경우 명시적 그룹이고 데이터에 따라 그룹이 동적으로 생성되는 경우 암시적 그룹입니다.The groups can be explicit, where the user supplies a list of groups, or implicit, where the groups are generated dynamically depending on the data.

다음 예제에서는 "범주별 그룹"의 논리를 보여 줍니다. CheckBox:The following example shows the logic of the "Group by category" CheckBox:

// This groups the items in the view by the property "Category"
PropertyGroupDescription groupDescription = new PropertyGroupDescription();
groupDescription.PropertyName = "Category";
listingDataView.GroupDescriptions.Add(groupDescription);
'This groups by property "Category"
Dim groupDescription As PropertyGroupDescription = New PropertyGroupDescription
groupDescription.PropertyName = "Category"
listingDataView.GroupDescriptions.Add(groupDescription)

다른 그룹화 예제를 보려면 GridView를 구현하는 ListView의 항목 그룹화를 참조하세요.For another grouping example, see Group Items in a ListView That Implements a GridView.

현재 항목 포인터Current Item Pointers

뷰는 현재 항목의 개념도 지원합니다.Views also support the notion of a current item. 컬렉션 뷰에서 개체를 탐색할 수 있습니다.You can navigate through the objects in a collection view. 탐색할 때 컬렉션의 특정 위치에 있는 개체를 검색할 수 있는 항목 포인터를 이동합니다.As you navigate, you are moving an item pointer that allows you to retrieve the object that exists at that particular location in the collection. 예제를 보려면 데이터 수집 뷰의 개체 탐색을 참조하세요.For an example, see Navigate Through the Objects in a Data CollectionView.

WPF는 뷰(지정한 뷰 또는 컬렉션의 기본 뷰)를 통해 컬렉션에 바인딩되므로 컬렉션에 대한 모든 바인딩에는 현재 항목 포인터가 포함됩니다.Because WPF binds to a collection only by using a view (either a view you specify, or the collection's default view), all bindings to collections have a current item pointer. 뷰에 바인딩할 때 Path 값의 슬래시("/") 문자는 뷰의 현재 항목을 지정합니다.When binding to a view, the slash ("/") character in a Path value designates the current item of the view. 다음 예제에서 데이터 컨텍스트는 컬렉션 뷰입니다.In the following example, the data context is a collection view. 첫 줄은 컬렉션에 바인딩됩니다.The first line binds to the collection. 두 번째 줄은 컬렉션의 현재 항목에 바인딩됩니다.The second line binds to the current item in the collection. 세 번째 줄은 컬렉션에 있는 현재 항목의 Description 속성에 바인딩됩니다.The third line binds to the Description property of the current item in the collection.

<Button Content="{Binding }" />  
<Button Content="{Binding Path=/}" />  
<Button Content="{Binding Path=/Description}" />   

컬렉션 계층 구조를 트래버스하도록 슬래시와 속성 구문을 쌓을 수도 있습니다.The slash and property syntax can also be stacked to traverse a hierarchy of collections. 다음 예제에서는 소스 컬렉션의 현재 항목 속성인 Offices라는 컬렉션의 현재 항목에 바인딩합니다.The following example binds to the current item of a collection named Offices, which is a property of the current item of the source collection.

<Button Content="{Binding /Offices/}" />  

컬렉션에 적용되는 정렬이나 필터링이 현재 항목 포인터에 영향을 미칠 수 있습니다.The current item pointer can be affected by any sorting or filtering that is applied to the collection. 정렬은 현재 항목 포인터를 선택된 마지막 항목에 유지하지만 이제 컬렉션 뷰는 포인터를 중심으로 재구성됩니다.Sorting preserves the current item pointer on the last item selected, but the collection view is now restructured around it. 이전에는 선택된 항목이 목록의 시작 부분에 있었을 수 있지만 이제 선택된 항목이 가운데 부분에 있을 수 있습니다. 필터링은 필터링한 후 선택 항목이 뷰에 남아 있으면 선택된 항목을 유지합니다.(Perhaps the selected item was at the beginning of the list before, but now the selected item might be somewhere in the middle.) Filtering preserves the selected item if that selection remains in view after the filtering. 남아 있지 않으면 현재 항목 포인터는 필터링된 컬렉션 뷰의 첫 번째 항목으로 설정됩니다.Otherwise, the current item pointer is set to the first item of the filtered collection view.

마스터-세부 바인딩 시나리오Master-Detail Binding Scenario

현재 항목의 개념은 컬렉션에서 항목을 탐색하는 경우뿐 아니라 마스터-세부 바인딩 시나리오에도 유용합니다.The notion of a current item is useful not only for navigation of items in a collection, but also for the master-detail binding scenario. 다시 데이터 바인딩이란? 섹션의 응용 프로그램 UIUI를 살펴보겠습니다.Consider the application UIUI in the What Is Data Binding? section again. 해당 응용 프로그램 내에서 선택 영역에에서는 ListBox 결정에 표시 되는 콘텐츠는 ContentControl합니다.In that application, the selection within the ListBox determines the content shown in the ContentControl. 또 다른 방법은에 배치할 때는 ListBox 항목을 선택 하면는 ContentControl 선택한 항목의 세부 정보를 표시 합니다.To put it in another way, when a ListBox item is selected, the ContentControl shows the details of the selected item.

간단히 두 개 이상의 컨트롤을 같은 뷰에 바인딩하여 마스터-세부 시나리오를 구현할 수 있습니다.You can implement the master-detail scenario simply by having two or more controls bound to the same view. 다음 예제는 데이터 바인딩 데모 의 태그를 보여 줍니다.는 ListBoxContentControl 응용 프로그램에 참조 UIUI데이터 바인딩의? 섹션:The following example from the Data Binding Demo shows the markup of the ListBox and the ContentControl you see on the application UIUI in the What Is Data Binding? section:

<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
    ItemsSource="{Binding Source={StaticResource listingDataView}}">
</ListBox>
<ContentControl Name="Detail" Grid.Row="3" Grid.ColumnSpan="3" 
        Content="{Binding Source={StaticResource listingDataView}}" 
        ContentTemplate="{StaticResource detailsProductListingTemplate}" 
        Margin="9,0,0,0"/>

컨트롤이 둘 다 같은 소스인 listingDataView 정적 리소스에 바인딩되어 있습니다(뷰를 만드는 방법 섹션에서 이 리소스의 정의 참조).Notice that both of the controls are bound to the same source, the listingDataView static resource (see the definition of this resource in the How to Create a View section). 하므로이 작업이 singleton 개체 (의 ContentControl 이 예제의) 바인딩된 컬렉션 뷰에 자동으로에 바인딩되기는 CurrentItem 보기의 합니다.This works because when a singleton object (the ContentControl in this case) is bound to a collection view, it automatically binds to the CurrentItem of the view. CollectionViewSource 개체는 통화 및 선택 영역에 자동으로 동기화 합니다.Note that CollectionViewSource objects automatically synchronize currency and selection. 목록 컨트롤에 바인딩되지 않은 경우는 CollectionViewSource 설정 해야 하는 다음이 예제와 같이 개체 해당 IsSynchronizedWithCurrentItem 속성을 true 이 수행 합니다.If your list control is not bound to a CollectionViewSource object as in this example, then you would need to set its IsSynchronizedWithCurrentItem property to true for this to work.

다른 예제를 보려면 선택에 따라 수집 및 표시 정보에 바인딩계층적 데이터에 마스터-세부 패턴 사용을 참조하세요.For other examples, see Bind to a Collection and Display Information Based on Selection and Use the Master-Detail Pattern with Hierarchical Data.

위 예제에서는 템플릿을 사용합니다.You may have noticed that the above example uses a template. 실제로 데이터가 표시 되지 않는 서식 파일을 사용 하지 않고도 원하는 대로 (에서 명시적으로 사용 하는 ContentControl 및 암시적으로 사용 되는 것은 ListBox).In fact, the data would not be displayed the way we wish without the use of templates (the one explicitly used by the ContentControl and the one implicitly used by the ListBox). 이제 다음 섹션에서 데이터 템플릿을 살펴보겠습니다.We now turn to data templating in the next section.

데이터 템플릿Data Templating

데이터 템플릿을 사용하지 않으면 데이터 바인딩이란? 섹션의 응용 프로그램 UIUI가 다음과 같이 표시됩니다.Without the use of data templates, our application UIUI in the What Is Data Binding? section would look like the following:

데이터 템플릿을 사용하지 않는 데이터 바인딩 데모Data Binding Demo without Data Templates

이전 섹션의 예제에 나와 있는 것 처럼 모두는 ListBox 제어 및 ContentControl 의 전체 컬렉션 개체 (또는 보다 구체적으로, 컬렉션 개체에 대해 보기)에 바인딩된 AuctionItems입니다.As shown in the example in the previous section, both the ListBox control and the ContentControl are bound to the entire collection object (or more specifically, the view over the collection object) of AuctionItems. 데이터 컬렉션을 표시 하는 방법에 특정 한 지침이 없으면는 ListBox 기본 컬렉션의 각 개체의 문자열 표현을 표시 및 ContentControl 에 바인딩되는 개체의 문자열 표현을 표시 합니다.Without specific instructions of how to display the data collection, the ListBox is displaying a string representation of each object in the underlying collection and the ContentControl is displaying a string representation of the object it is bound to.

이러한 문제를 해결 하기 위해 응용 프로그램 정의 DataTemplates입니다.To solve that problem, the application defines DataTemplates. 이전 섹션의 예제에 나와 있는 것 처럼는 ContentControl 명시적으로 사용 하 여는 detailsProductListingTemplateDataTemplate합니다.As shown in the example in the previous section, the ContentControl explicitly uses the detailsProductListingTemplateDataTemplate. ListBox 컨트롤이 암시적으로 사용 하 여 다음 DataTemplate 표시할 때의 AuctionItem 컬렉션의 개체:The ListBox control implicitly uses the following DataTemplate when displaying the AuctionItem objects in the collection:

<DataTemplate DataType="{x:Type src:AuctionItem}">
    <Border BorderThickness="1" BorderBrush="Gray"
            Padding="7" Name="border" Margin="3" Width="500">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="86"/>
            <ColumnDefinition Width="*"/>
          </Grid.ColumnDefinitions>
              
            <Polygon Grid.Row="0" Grid.Column="0" Grid.RowSpan="4"
                     Fill="Yellow" Stroke="Black" StrokeThickness="1"
                     StrokeLineJoin="Round" Width="20" Height="20"
                     Stretch="Fill"
                     Points="9,2 11,7 17,7 12,10 14,15 9,12 4,15 6,10 1,7 7,7"
                     Visibility="Hidden" Name="star"/>

            <TextBlock Grid.Row="0" Grid.Column="1" Margin="0,0,8,0"
                       Name="descriptionTitle"
                       Style="{StaticResource smallTitleStyle}">Description:</TextBlock>
            <TextBlock Name="DescriptionDTDataType" Grid.Row="0" Grid.Column="2" 
                Text="{Binding Path=Description}" 
                Style="{StaticResource textStyleTextBlock}"/>

            <TextBlock Grid.Row="1" Grid.Column="1" Margin="0,0,8,0"
                       Name="currentPriceTitle"
                       Style="{StaticResource smallTitleStyle}">Current Price:</TextBlock>
            <StackPanel Grid.Row="1" Grid.Column="2" Orientation="Horizontal">
                <TextBlock Text="$" Style="{StaticResource textStyleTextBlock}"/>
                <TextBlock Name="CurrentPriceDTDataType" 
                    Text="{Binding Path=CurrentPrice}" 
                    Style="{StaticResource textStyleTextBlock}"/>
            </StackPanel>
        </Grid>
    </Border>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=SpecialFeatures}">
            <DataTrigger.Value>
                <src:SpecialFeatures>Color</src:SpecialFeatures>
            </DataTrigger.Value>
          <DataTrigger.Setters>
            <Setter Property="BorderBrush" Value="DodgerBlue" TargetName="border" />
            <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
            <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
            <Setter Property="BorderThickness" Value="3" TargetName="border" />
            <Setter Property="Padding" Value="5" TargetName="border" />
          </DataTrigger.Setters>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=SpecialFeatures}">
            <DataTrigger.Value>
                <src:SpecialFeatures>Highlight</src:SpecialFeatures>
            </DataTrigger.Value>
            <Setter Property="BorderBrush" Value="Orange" TargetName="border" />
            <Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
            <Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
            <Setter Property="Visibility" Value="Visible" TargetName="star" />
            <Setter Property="BorderThickness" Value="3" TargetName="border" />
            <Setter Property="Padding" Value="5" TargetName="border" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

이 두를 사용 하 여 DataTemplates, UI에 표시 된 것은는 데이터 바인딩의? 섹션.With the use of those two DataTemplates, the resulting UI is the one shown in the What Is Data Binding? section. 해당 스크린 샷 알 수 있듯이 있을 뿐만 아니라 데이터의에서 넣으면 컨트롤 DataTemplates를 사용 하면 데이터에 대 한 매력적인 시각적 개체를 정의할 수 있습니다.As you can see from that screenshot, in addition to letting you place data in your controls, DataTemplates allow you to define compelling visuals for your data. 예를 들어 DataTrigger위의 DataTemplate 있도록 AuctionItems SpecialFeatures 의 값 강조 표시 으로 표시 되는 주황색 테두리와 별입니다.For example, DataTriggers are used in the above DataTemplate so that AuctionItems with SpecialFeatures value of HighLight would be displayed with an orange border and a star.

데이터 템플릿에 대한 자세한 내용은 데이터 템플릿 개요를 참조하세요.For more information about data templates, see the Data Templating Overview.

데이터 유효성 검사Data Validation

사용자 입력을 사용하는 대부분 응용 프로그램에는 사용자가 필요한 정보를 입력했는지 확인할 수 있는 유효성 검사 논리가 있어야 합니다.Most applications that take user input need to have validation logic to ensure that the user has entered the expected information. 유효성 검사는 형식, 범위, 서식 또는 기타 응용 프로그램별 요구 사항에 따라 달라질 수 있습니다.The validation checks can be based on type, range, format, or other application-specific requirements. 이 섹션에서는 WPFWPF에서 데이터 유효성 검사를 사용하는 방법을 설명합니다.This section discusses how data validation works in the WPFWPF.

유효성 검사 규칙과 바인딩 연결Associating Validation Rules with a Binding

WPFWPF 데이터 바인딩 모델에 연결할 수 있습니다. ValidationRules 와 프로그램 Binding 개체입니다.The WPFWPF data binding model allows you to associate ValidationRules with your Binding object. 예를 들어 다음 예제에서는 TextBox 라는 속성을 StartPrice 추가 ExceptionValidationRule 개체는 Binding.ValidationRules 속성입니다.For example, the following example binds a TextBox to a property named StartPrice and adds a ExceptionValidationRule object to the Binding.ValidationRules property.

<TextBox Name="StartPriceEntryForm" Grid.Row="2" Grid.Column="1"
    Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5">
  <TextBox.Text>
    <Binding Path="StartPrice" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <ExceptionValidationRule />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

A ValidationRule 개체 속성의 값이 유효한 지 확인 합니다.A ValidationRule object checks whether the value of a property is valid. WPFWPF 에 다음 두 가지 유형의 기본 제공 ValidationRule 개체: has the following two types of built-in ValidationRule objects:

파생 하 여 고유한 유효성 검사 규칙을 만들 수도 있습니다는 ValidationRule 클래스 및 구현 된 Validate 메서드.You can also create your own validation rule by deriving from the ValidationRule class and implementing the Validate method. 다음 예제에서 사용 하는 규칙을 보여 줍니다.는 제품 목록 추가 "시작 날짜" TextBox 에서 데이터 바인딩의? 섹션:The following example shows the rule used by the Add Product Listing "Start Date" TextBox from the What Is Data Binding? section:

class FutureDateRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        DateTime date;
        try
        {
            date = DateTime.Parse(value.ToString());
        }
        catch (FormatException)
        {
            return new ValidationResult(false, "Value is not a valid date.");
        }
        if (DateTime.Now.Date > date)
        {
            return new ValidationResult(false, "Please enter a date in the future.");
        }
        else
        {
            return ValidationResult.ValidResult;
        }
    }
}
Public Class FutureDateRule
    Inherits ValidationRule

    Public Overrides Function Validate(ByVal value As Object,
                                       ByVal cultureInfo As System.Globalization.CultureInfo) _
                                   As System.Windows.Controls.ValidationResult

        Dim DateVal As DateTime

        Try
            DateVal = DateTime.Parse(value.ToString)
        Catch ex As FormatException
            Return New ValidationResult(False, "Value is not a valid date.")
        End Try

        If DateTime.Now.Date > DateVal Then
            Return New ValidationResult(False, "Please enter a date in the future.")
        Else
            Return ValidationResult.ValidResult
        End If
    End Function
End Class

StartDateEntryForm TextBox 이 사용 하 여 FutureDateRule다음 예제에 나온 것 처럼:The StartDateEntryForm TextBox uses this FutureDateRule, as shown in the following example:

<TextBox Name="StartDateEntryForm" Grid.Row="3" Grid.Column="1" 
    Validation.ErrorTemplate="{StaticResource validationTemplate}" 
    Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5">
    <TextBox.Text>
        <Binding Path="StartDate" UpdateSourceTrigger="PropertyChanged" 
            Converter="{StaticResource dateConverter}" >
            <Binding.ValidationRules>
                <src:FutureDateRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

되므로 UpdateSourceTrigger 값은 PropertyChanged, 바인딩 엔진에서 모든 규칙 즉 것도 검사 페이지가 활성화 소스 값이 업데이트는 ValidationRules 이기 합니다.Note that because the UpdateSourceTrigger value is PropertyChanged, the binding engine updates the source value on every keystroke, which means it also checks every rule in the ValidationRules collection on every keystroke. 이 내용은 유효성 검사 프로세스 섹션에서 자세히 설명합니다.We discuss this further in the Validation Process section.

시각적 피드백 제공Providing Visual Feedback

사용자가 잘못된 값을 입력할 경우 응용 프로그램 UIUI에 오류에 대한 피드백을 표시해야 할 수 있습니다.If the user enters an invalid value, you may want to provide some feedback about the error on the application UIUI. 설정 하는 이러한 의견을 제공 하는 한 가지 방법은 Validation.ErrorTemplate 연결 된 속성을 사용자 지정 ControlTemplate합니다.One way to provide such feedback is to set the Validation.ErrorTemplate attached property to a custom ControlTemplate. 이전 하위 섹션에 나와 있는 것 처럼는 StartDateEntryForm TextBox 사용 하 여 프로그램 ErrorTemplate 호출 validationTemplate합니다.As shown in the previous subsection, the StartDateEntryForm TextBox uses an ErrorTemplate called validationTemplate. 다음 예제에서는 validationTemplate의 정의를 보여 줍니다.The following example shows the definition of validationTemplate:

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

AdornedElementPlaceholder 요소 장식 되는 컨트롤을 배치할 위치를 지정 합니다.The AdornedElementPlaceholder element specifies where the control being adorned should be placed.

또한 사용할 수도 있습니다는 ToolTip 오류 메시지를 표시 합니다.In addition, you may also use a ToolTip to display the error message. 두는 StartDateEntryFormStartPriceEntryFormTextBoxes 스타일을 사용 하 여 textStyleTextBox, 만듦는 ToolTip 하 오류 메시지를 표시 합니다.Both the StartDateEntryForm and the StartPriceEntryFormTextBoxes use the style textStyleTextBox, which creates a ToolTip that displays the error message. 다음 예제에서는 textStyleTextBox의 정의를 보여 줍니다.The following example shows the definition of textStyleTextBox. 연결 된 속성 HasErrortrue 바인딩된 요소의 속성에는 바인딩 중 하나 이상이 있는 경우 오류입니다.The attached property HasError is true when one or more of the bindings on the properties of the bound element are in error.

<Style x:Key="textStyleTextBox" TargetType="TextBox">
  <Setter Property="Foreground" Value="#333333" />
  <Setter Property="MaxLength" Value="40" />
  <Setter Property="Width" Value="392" />
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={RelativeSource Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

사용자 지정 ErrorTemplateToolTip, StartDateEntryForm TextBox 유효성 검사 오류가 있을 때 다음과 같은:With the custom ErrorTemplate and the ToolTip, the StartDateEntryForm TextBox looks like the following when there is a validation error:

데이터 바인딩 유효성 검사 오류Data binding validation error

경우에 Binding 유효성 검사 규칙에 연결 된 지정 하지 않으면는 ErrorTemplate 바인딩된 컨트롤을 기본 ErrorTemplate 유효성 검사 오류가 있을 때 사용자가 알리는 데 사용 됩니다.If your Binding has associated validation rules but you do not specify an ErrorTemplate on the bound control, a default ErrorTemplate will be used to notify users when there is a validation error. 기본 ErrorTemplate 빨간색 테두리가 표시기 계층에서 정의 하는 컨트롤 서식 파일입니다.The default ErrorTemplate is a control template that defines a red border in the adorner layer. 기본 ErrorTemplateToolTip, UIUIStartPriceEntryForm TextBox 유효성 검사 오류가 있을 때 다음과 같은:With the default ErrorTemplate and the ToolTip, the UIUI of the StartPriceEntryForm TextBox looks like the following when there is a validation error:

데이터 바인딩 유효성 검사 오류Data binding validation error

대화 상자에서 모든 컨트롤의 유효성을 검사하는 논리를 제공하는 방법의 예제를 보려면 대화 상자 개요에서 사용자 지정 대화 상자 섹션을 참조하세요.For an example of how to provide logic to validate all controls in a dialog box, see the Custom Dialog Boxes section in the Dialog Boxes Overview.

유효성 검사 프로세스Validation Process

유효성 검사는 대개 대상 값이 바인딩 소스 속성에 전송될 때 수행됩니다.Validation usually occurs when the value of a target is transferred to the binding source property. 으로 수행 TwoWayOneWayToSource 바인딩.This occurs on TwoWay and OneWayToSource bindings. 다시 말해,의 값에 따라 소스 업데이트가 발생 원인는 UpdateSourceTrigger 속성에 설명 된 대로 트리거 소스 업데이트 항목 섹션.To reiterate, what causes a source update depends on the value of the UpdateSourceTrigger property, as described in the What Triggers Source Updates section.

유효성 검사 프로세스에 대한 설명은 다음과 같습니다.The following describes the validation process. 이 프로세스 중에 유효성 검사 오류나 기타 오류가 발생하면 프로세스가 중단됩니다.Note that if a validation error or other type of error occurs at any time during this process, the process is halted.

  1. 바인딩 엔진에 사용자 지정 되어 있는지 확인 ValidationRule 개체는 정의 된 ValidationStep 로 설정 된 RawProposedValue 해당 Binding를 호출 하는 경우는 Validate 각 메서드 ValidationRule 오류 중 하나가 실행 될 때까지 되거나 모두 통과 합니다.The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to RawProposedValue for that Binding, in which case it calls the Validate method on each ValidationRule until one of them runs into an error or until all of them pass.

  2. 그런 다음 바인딩 엔진은 변환기를 호출합니다(있는 경우).The binding engine then calls the converter, if one exists.

  3. 바인딩 엔진에는 사용자 지정 되어 있는지 확인 하는 변환기에 성공 하면 ValidationRule 개체는 정의 된 ValidationStep 로 설정 된 ConvertedProposedValue 해당 Binding를 호출 하는 경우는 Validate 각 메서드 ValidationRule 있는 ValidationStep 로 설정 ConvertedProposedValue 모두 통과 하거나 해당 개체 중 하나는 동안 오류가 발생 될 때까지 합니다.If the converter succeeds, the binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to ConvertedProposedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to ConvertedProposedValue until one of them runs into an error or until all of them pass.

  4. 바인딩 엔진은 소스 속성을 설정합니다.The binding engine sets the source property.

  5. 바인딩 엔진에 사용자 지정 되어 있는지 확인 ValidationRule 개체는 정의 된 ValidationStep 로 설정 되어 UpdatedValue 해당 Binding를 호출 하는 경우는 Validate 각 메서드 ValidationRule 올려진 ValidationStep 로 설정 UpdatedValue 모두 통과 하거나 해당 개체 중 하나는 동안 오류가 발생 될 때까지 합니다.The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to UpdatedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to UpdatedValue until one of them runs into an error or until all of them pass. 경우는 DataErrorValidationRule 는 바인딩과 연결 된 및 해당 ValidationStep 기본값으로 설정 되어 UpdatedValue, DataErrorValidationRule 이 시점에서 확인 됩니다.If a DataErrorValidationRule is associated with a binding and its ValidationStep is set to the default, UpdatedValue, the DataErrorValidationRule is checked at this point. 지점 이기도 때 포함 된 바인딩이 ValidatesOnDataErrors 로 설정 true 확인 됩니다.This is also the point when bindings that have the ValidatesOnDataErrors set to true are checked.

  6. 바인딩 엔진에 사용자 지정 되어 있는지 확인 ValidationRule 개체는 정의 된 ValidationStep 로 설정 되어 CommittedValue 해당 Binding를 호출 하는 경우는 Validate 각 메서드 ValidationRule 올려진 ValidationStep 로 설정 CommittedValue 모두 통과 하거나 해당 개체 중 하나는 동안 오류가 발생 될 때까지 합니다.The binding engine checks if there are any custom ValidationRule objects defined whose ValidationStep is set to CommittedValue for that Binding, in which case it calls the Validate method on each ValidationRule that has ValidationStep set to CommittedValue until one of them runs into an error or until all of them pass.

경우는 ValidationRule 통과 하지 못하면이 프로세스 전체에서 언제 든 바인딩 엔진을 만듭니다는 ValidationError 개체에 추가 합니다는 Errors 바인딩된 요소의 컬렉션입니다.If a ValidationRule does not pass at any time throughout this process, the binding engine creates a ValidationError object and adds it to the Errors collection of the bound element. 엔진이 실행 되는 바인딩 전에 ValidationRule 제거 된 지정된 된 단계에서 개체 ValidationError 추가 된는 Errors 해당 단계에서 연결 된 바인딩된 요소의 속성입니다.Before the binding engine runs the ValidationRule objects at any given step, it removes any ValidationError that was added to the Errors attached property of the bound element during that step. 예를 들어 경우는 ValidationRuleValidationStep 로 설정 된 UpdatedValue 실패, 유효성 검사 프로세스가 발생 바인딩 엔진을 제거 하는 다음에 ValidationError 하나를 호출 하기 전에 즉시 ValidationRule 올려진 ValidationStep 로 설정 UpdatedValue.For example, if a ValidationRule whose ValidationStep is set to UpdatedValue failed, the next time the validation process occurs, the binding engine removes that ValidationError immediately before it calls any ValidationRule that has ValidationStep set to UpdatedValue.

Errors 비어 있지 않으면는 HasError 요소의 연결된 속성이로 설정 되어 true합니다.When Errors is not empty, the HasError attached property of the element is set to true. 또한 경우는 NotifyOnValidationError 속성의는 Binding 로 설정 되어 true, 바인딩 엔진에서 발생 한 후의 Validation.Error 요소에서 연결 된 이벤트입니다.Also, if the NotifyOnValidationError property of the Binding is set to true, then the binding engine raises the Validation.Error attached event on the element.

유효한 값을 전송 (원본이 나 대상에는 원본 또는 대상) 어느 방향으로든에서 지웁니다 참고도는 Errors 연결 된 속성입니다.Also note that a valid value transfer in either direction (target to source or source to target) clears the Errors attached property.

바인딩에 중 하나는 다음과 같은 경우는 ExceptionValidationRule 연관 되거나는 ValidatesOnExceptions 속성이 true 바인딩 엔진이 소스를 설정 하는 경우 예외가 throw 됩니다, 바인딩 엔진 확인 하는 경우 및는 UpdateSourceExceptionFilter합니다.If the binding either has an ExceptionValidationRule associated with it, or had the ValidatesOnExceptions property is set to true and an exception is thrown when the binding engine sets the source, the binding engine checks to see if there is a UpdateSourceExceptionFilter. 사용 하는 옵션이 고 UpdateSourceExceptionFilter 예외를 처리 하기 위한 사용자 지정 처리기를 제공 하는 콜백 합니다.You have the option to use the UpdateSourceExceptionFilter callback to provide a custom handler for handling exceptions. 경우는 UpdateSourceExceptionFilter 에 지정 되어 있지는 Binding, 바인딩 엔진을 만듭니다는 ValidationError 예외와에 추가 Errors 바인딩된 요소의 컬렉션입니다.If an UpdateSourceExceptionFilter is not specified on the Binding, the binding engine creates a ValidationError with the exception and adds it to the Errors collection of the bound element.

디버깅 메커니즘Debugging Mechanism

연결 된 속성을 설정할 수 있습니다 TraceLevel 특정 바인딩 상태에 대 한 정보를 받을 바인딩 관련 개체에 있습니다.You can set the attached property TraceLevel on a binding-related object to receive information about the status of a specific binding.

참고 항목See Also

DataErrorValidationRule
WPF 버전 4.5의 새로운 기능What's New in WPF Version 4.5
LINQ 쿼리 결과에 바인딩Bind to the Results of a LINQ Query
데이터 바인딩Data Binding
데이터 바인딩 데모Data Binding Demo
방법 항목How-to Topics
ADO.NET 데이터 소스 바인딩Bind to an ADO.NET Data Source