UI에서 실제 데이터를 표시하고 조작하는 것은 많은 앱의 기능에 매우 중요합니다. 이 문서에서는 목록에 Customer 개체 컬렉션을 표시하기 위해 알아야 할 내용을 보여줍니다.
자습서가 아닙니다. 튜토리얼이 필요하신 경우, 단계별로 안내하는 환경을 제공하는 데이터 바인딩 자습서을 참조하세요.
데이터 바인딩의 개념과 작동 방식에 대한 빠른 논의부터 시작하겠습니다. 그런 다음 UI에 ListView 를 추가하고, 데이터 바인딩을 추가하고, 추가 기능을 사용하여 데이터 바인딩을 사용자 지정합니다.
알아야 할 사항
데이터 바인딩은 앱의 데이터를 UI에 표시하는 방법입니다. 이렇게 하면 앱에서 관심사의 분리를 통해, UI를 다른 코드와 분리할 수 있습니다. 이렇게 하면 더 쉽게 읽고 유지 관리할 수 있는 보다 명확한 개념적 모델이 만들어집니다.
모든 데이터 바인딩에는 다음 두 가지가 있습니다.
- 바인딩할 데이터를 제공하는 원본입니다.
- 데이터가 표시되는 UI의 대상입니다.
데이터 바인딩을 구현하려면 바인딩에 데이터를 제공하는 코드를 소스에 추가해야 합니다. 또한 데이터 원본 속성을 지정하려면 XAML에 두 개의 태그 확장 중 하나를 추가해야 합니다. 이 두 가지의 주요 차이점은 다음과 같습니다.
- x:Bind 강력한 형식이며, 더 나은 성능을 위해 컴파일 시간에 코드를 생성합니다. x:Bind는 기본적으로 일회용 바인딩으로 설정되며, 이는 변경되지 않는 읽기 전용 데이터의 빠른 표시에 최적화됩니다.
- 바인딩은 런타임에 약하게 타이핑되어 어셈블됩니다. 이로 인해 x:Bind보다 성능이 저하됩니다. 거의 모든 경우에 바인딩 대신 x:Bind를 사용해야 합니다. 그러나 이전 코드에서 발생할 가능성이 높습니다. 바인딩은 기본적으로 단방향 데이터 전송으로 설정되며, 원본에서 변경할 수 있는 읽기 전용 데이터에 최적화됩니다.
가능하면 x:Bind을 사용하는 것을 추천합니다. 이 문서의 코드 조각에서 이를 보여드리겠습니다. 차이점에 대한 자세한 내용은 {x:Bind} 및 {Binding} 기능 비교를 참조하세요.
데이터 원본 만들기
먼저 고객 데이터를 나타내는 클래스가 필요합니다. 참조점을 제공하기 위해 이 기본 예제를 통해 과정을 보여드리겠습니다.
public class Customer
{
public string Name { get; set; }
}
목록 만들기
고객을 표시하려면 해당 고객을 보관할 목록을 만들어야 합니다. 목록 보기는 이 작업에 적합한 기본 XAML 컨트롤입니다. ListView에는 현재 페이지의 위치가 필요하며 곧 ItemSource 속성에 대한 값이 필요합니다.
<ListView ItemsSource=""
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
ListView에 데이터를 바인딩한 후에는 설명서로 돌아가 필요에 가장 적합한 모양과 레이아웃을 사용자 지정하는 것이 좋습니다.
목록에 데이터 바인딩
바인딩을 저장할 기본 UI를 만들었으므로 이제 바인딩을 제공하도록 원본을 구성해야 합니다. 이 작업을 수행하는 방법의 예는 다음과 같습니다.
public sealed partial class MainPage : Page
{
public ObservableCollection<Customer> Customers { get; }
= new ObservableCollection<Customer>();
public MainPage()
{
this.InitializeComponent();
// Add some customers
this.Customers.Add(new Customer() { Name = "NAME1"});
this.Customers.Add(new Customer() { Name = "NAME2"});
this.Customers.Add(new Customer() { Name = "NAME3"});
}
}
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBlock Text="{x:Bind Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
데이터 바인딩 개요의 항목 컬렉션에 바인딩하는 방법에 대한 섹션에서는 유사한 문제를 단계별로 설명합니다. 이 예제에서는 다음과 같은 중요한 단계를 보여줍니다.
- UI의 코드 숨김 파일에서 Customer 개체를 저장하기 위해 ObservableCollection<T> 형식의 속성을 만드세요.
- ListView의 ItemSource 를 해당 속성에 바인딩합니다.
- 목록의 각 항목이 표시되는 방식을 구성하는 ListView에 대한 기본 ItemTemplate 을 제공합니다.
레이아웃을 사용자 지정하거나, 항목 선택을 추가하거나, 방금 만든 DataTemplate을 조정하려는 경우 목록 보기 문서를 다시 살펴볼 수 있습니다. 하지만 고객을 편집하려면 어떻게 해야 할까요?
UI를 통해 고객 정보를 수정하세요
목록에 고객을 표시했지만 데이터 바인딩을 통해 더 많은 작업을 수행할 수 있습니다. UI에서 직접 데이터를 편집할 수 있다면 어떻게 해야 할까요? 이렇게 하려면 먼저 데이터 바인딩의 세 가지 모드에 대해 살펴보겠습니다.
- 일회성: 이 데이터 바인딩은 한 번만 활성화되며 변경 내용에 반응하지 않습니다.
- 단방향: 이 데이터 바인딩은 데이터 원본에 대한 변경 내용으로 UI를 업데이트합니다.
- 양방향: 이 데이터 바인딩은 데이터 원본의 변경 사항을 UI에 반영하고, UI 내의 변경 사항을 데이터에 반영합니다.
앞에서 만든 코드 조각을 따른 경우 만든 바인딩은 x:Bind를 사용하고 모드를 지정하지 않으므로 One-Time 바인딩이 됩니다. UI에서 직접 고객을 편집하려면 데이터 변경 내용이 고객 개체로 다시 전달되도록 Two-Way 바인딩으로 변경해야 합니다. 데이터 바인딩의 심층 분석에 더 많은 정보가 있습니다.
양방향 바인딩은 데이터 원본이 변경된 경우에도 UI를 업데이트합니다. 이 작업을 수행하려면 원본에서 INotifyPropertyChanged를 구현하고, 속성 setter가 PropertyChanged 이벤트를 발생시켜야 합니다. 일반적인 방법은 아래와 같이 OnPropertyChanged 메서드와 같은 도우미 메서드를 호출하도록 하는 것입니다.
public class Customer : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
this.OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
그런 다음 TextBlock대신 TextBox 사용하여 ListView의 텍스트를 편집할 수 있도록 하고 데이터 바인딩의 모드TwoWay설정해야 합니다.
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBox Text="{x:Bind Name, Mode=TwoWay}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
이 작업이 작동하는지 확인하는 빠른 방법은 TextBox 컨트롤 및 OneWay 바인딩을 사용하여 두 번째 ListView를 추가하는 것입니다. 첫 번째 목록을 편집하면 두 번째 목록의 값이 자동으로 변경됩니다.
비고
ListView 내에서 직접 편집하는 것은 Two-Way 바인딩을 표시하는 간단한 방법이지만 유용성 복잡성이 발생할 수 있습니다. 앱의 기능을 확장하고자 한다면 다른 XAML 컨트롤을 사용하여 데이터를 편집하는 데 활용하고, ListView는 표시 전용으로 유지하는 것이 좋습니다.
더 나아가기
이제 양방향 바인딩을 사용하여 고객 목록을 만들었으므로, 연결된 문서를 자유롭게 다시 살펴보고 실험해 보세요. 기본 및 고급 바인딩의 단계별 연습을 원하는 경우 데이터 바인딩 자습서 를 확인하거나 목록/세부 정보 패턴 과 같은 컨트롤을 조사하여 보다 강력한 UI를 만들 수도 있습니다.
유용한 API 및 문서
다음은 데이터 바인딩 작업을 시작하는 데 도움이 되는 API 및 기타 유용한 설명서의 빠른 요약입니다.
유용한 API
| 응용 프로그램 인터페이스 (API) | 설명 |
|---|---|
| 데이터 템플릿 | UI에서 특정 요소를 표시할 수 있도록 하는 데이터 개체의 시각적 구조를 설명합니다. |
| x:Bind | 권장되는 x:Bind 태그 확장에 대한 설명서입니다. |
| 바인딩 | 이전 바인딩 태그 확장에 대한 설명서입니다. |
| ListView | 세로 스택에 데이터 항목을 표시하는 UI 컨트롤입니다. |
| 텍스트박스 | 편집 가능한 텍스트 데이터를 UI에 표시하기 위한 기본 텍스트 컨트롤입니다. |
| INotifyPropertyChanged |
데이터를 관찰 가능하게 만들어서 데이터 바인드에 활용하는 인터페이스입니다. |
| ItemsControl |
이 클래스의 ItemsSource 속성을 사용하면 ListView가 데이터 원본에 바인딩할 수 있습니다. |
유용한 문서
| 주제 | 설명 |
|---|---|
| 데이터 바인딩의 심층 이해 | 데이터 바인딩 원칙의 기본 개요 |
| 데이터 바인딩 개요 | 데이터 바인딩에 대한 자세한 개념 정보입니다. |
| 목록 보기 | DataTemplate 구현을 포함하여 ListView 만들기 및 구성에 대한 정보 |
유용한 코드 샘플
| 코드 샘플 | 설명 |
|---|---|
| 데이터 바인딩 자습서 | 데이터 바인딩의 기초를 이해하는 데 도움이 되는 단계별 체험 안내서입니다. |
| ListView 및 GridView | 데이터 바인딩을 사용하여 보다 정교한 ListView를 살펴봅니다. |
| QuizGame | "실행 중인 데이터 바인딩을 확인해 보세요. 여기에는 표준 구현 예인 BindableBase 클래스("Common" 폴더 포함)가 INotifyPropertyChanged을 위해 포함되어 있습니다." |