다음을 통해 공유


{x:Bind} 마크업 확장

메모{x:Bind}를 사용하여 앱에서 데이터 바인딩을 사용하는 방법에 대한 일반적인 정보(및 {x:Bind}와 {Binding}의 전체 비교)는 데이터 바인딩을 자세히 참조하세요.

{x:Bind} 태그 확장(Windows 10의 새로운 기능)은 {Binding}의 대안입니다. {x:Bind}{Binding} 보다 적은 시간과 적은 메모리로 실행되며 더 나은 디버깅을 지원합니다.

XAML 컴파일 시간에 {x:Bind} 는 데이터 원본의 속성에서 값을 가져와 태그에 지정된 속성에 설정하는 코드로 변환됩니다. 데이터 원본 속성 값의 변경 내용을 관찰하고 변경 내용(Mode="OneWay")에 따라 자체적으로 새로 고치도록 바인딩 개체를 선택적으로 구성할 수 있습니다. 필요에 따라 자체 값의 변경 내용을 원본 속성(Mode="TwoWay")으로 다시 푸시하도록 구성할 수도 있습니다.

{x:Bind}{Binding}에서 만든 바인딩 개체는 대체로 기능적으로 동일합니다. 그러나 {x:Bind} 는 컴파일 타임에 생성되는 특수 용도의 코드를 실행하고 {Binding} 은 범용 런타임 개체 검사를 사용합니다. 따라서 {x:Bind} 바인딩(컴파일된 바인딩이라고도 함)은 뛰어난 성능을 발휘하고, 바인딩 식의 컴파일 시간 유효성 검사를 제공하며, 페이지의 부분 클래스로 생성된 코드 파일에서 중단점을 설정할 수 있도록 하여 디버깅을 지원합니다. 이러한 파일은 (C#의 경우) obj같은 이름으로 폴더에서 <view name>.g.cs 찾을 수 있습니다.

팁 (조언)

{x:Bind}에는 OneTime의 기본 모드가 있으며, {Binding}에는 OneWay의 기본 모드가 있습니다. OneWay를 사용하면 변경 내용 검색을 연결하고 처리하기 위해 더 많은 코드가 생성되기 때문에 성능상의 이유로 선택되었습니다. OneWay 또는 TwoWay 바인딩을 사용하는 모드를 명시적으로 지정할 수 있습니다. x:DefaultBindMode를 사용하여 태그 트리의 특정 세그먼트에 대한 {x:Bind}의 기본 모드를 변경할 수도 있습니다. 지정된 모드는 바인딩의 일부로 모드를 명시적으로 지정하지 않는 해당 요소 및 해당 자식의 {x:Bind} 식에 적용됩니다.

XAML 특성 사용

<object property="{x:Bind}" .../>
-or-
<object property="{x:Bind propertyPath}" .../>
-or-
<object property="{x:Bind bindingProperties}" .../>
-or-
<object property="{x:Bind propertyPath, bindingProperties}" .../>
-or-
<object property="{x:Bind pathToFunction.functionName(functionParameter1, functionParameter2, ...), bindingProperties}" .../>
용어 Description
propertyPath 바인딩의 속성 경로를 지정하는 문자열입니다. 자세한 내용은 아래 의 속성 경로 섹션에 있습니다.
bindingProperties
propName=value[, propName=value]* 이름/값 쌍 구문을 사용하여 지정된 하나 이상의 바인딩 속성입니다.
propName 바인딩 개체에 설정할 속성의 문자열 이름입니다. 예를 들어 "Converter"입니다.
value 속성을 설정할 값입니다. 인수의 구문은 설정되는 속성에 따라 달라집니다. 다음은 propName=이 자체적으로 마크업 확장인 경우의 사용 예입니다: Converter={StaticResource myConverterClass}. 자세한 내용은 아래 의 {x:Bind} 섹션을 사용하여 설정할 수 있는 속성을 참조하세요.

예시

<Page x:Class="QuizGame.View.HostView" ... >
    <Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
</Page>

이 예제 XAML은 ListView.ItemTemplate 속성과 함께 {x:Bind}를 사용합니다. x:DataType 값의 선언을 확인합니다.

  <DataTemplate x:Key="SimpleItemTemplate" x:DataType="data:SampleDataGroup">
    <StackPanel Orientation="Vertical" Height="50">
      <TextBlock Text="{x:Bind Title}"/>
      <TextBlock Text="{x:Bind Description}"/>
    </StackPanel>
  </DataTemplate>

속성 경로

PropertyPath{x:Bind} 식의 경로를 설정합니다. 경로 는 바인딩할 속성, 하위 속성, 필드 또는 메서드의 값을 지정하는 속성 경로입니다(원본). Path 속성의 이름을 명시적으로 {x:Bind Path=...}언급할 수 있습니다. 또는 생략할 수 있습니다. {x:Bind ...}.

속성 경로 처리

{x:Bind}DataContext 를 기본 원본으로 사용하지 않으며, 대신 페이지 또는 사용자 컨트롤 자체를 사용합니다. 페이지 또는 사용자 컨트롤의 코드 숨김에서 속성, 필드 및 메서드를 찾습니다. 보기 모델을 {x:Bind}에 노출하려면 일반적으로 페이지 또는 사용자 컨트롤의 코드 숨김에 새 필드 또는 속성을 추가하려고 합니다. 속성 경로의 단계는 점(.)으로 구분되며 여러 구분 기호를 포함하여 연속 하위 속성을 트래버스할 수 있습니다. 바인딩되는 개체를 구현하는 데 사용되는 프로그래밍 언어에 관계없이 점 구분 기호를 사용합니다.

예를 들어 페이지에서 Text="{x:Bind Employee.FirstName}"은 페이지에서 Employee 멤버를 찾은 다음 Employee에서 반환된 개체에서 FirstName 멤버를 찾습니다. 항목 컨트롤을 직원의 종속이 포함된 속성에 바인딩하는 경우 속성 경로는 "Employee.Dependents"일 수 있으며 항목 컨트롤의 항목 템플릿은 "Dependents"에 항목을 표시하는 것을 처리합니다.

C++/CX의 경우 {x:Bind} 는 페이지 또는 데이터 모델의 개인 필드 및 속성에 바인딩할 수 없습니다. 바인딩할 수 있도록 공용 속성이 있어야 합니다. 관련 메타데이터를 가져올 수 있도록 바인딩의 노출 영역을 CX 클래스/인터페이스로 노출해야 합니다. [Bindable] 특성은 필요하지 않습니다.

x:Bind를 사용하면 ElementName=xxx를 바인딩 식의 일부로 사용할 필요가 없습니다. 대신 명명된 요소가 루트 바인딩 소스를 나타내는 페이지 또는 사용자 컨트롤 내의 필드가 되기 때문에 요소의 이름을 바인딩 경로의 첫 번째 부분으로 사용할 수 있습니다.

Collections

데이터 원본이 컬렉션인 경우 속성 경로는 해당 위치 또는 인덱스로 컬렉션의 항목을 지정할 수 있습니다. 예를 들어 "Teams[0].Players"에서, 리터럴 "[]"는 0부터 시작하는 인덱스를 가진 컬렉션의 첫 번째 항목을 요청하는 "0"을 감싼다.

인덱서 사용을 위해 모델은 인덱싱할 속성 형식에서 IList<T> 또는 IVector<T> 를 구현해야 합니다. (IReadOnlyList<에 유의하세요.T> 및 IVectorView<T> 는 인덱서 구문을 지원하지 않습니다.) 인덱싱된 속성의 형식이 INotifyCollectionChanged 또는 IObservableVector 를 지원하고 바인딩이 OneWay 또는 TwoWay인 경우 해당 인터페이스에서 변경 알림을 등록하고 수신 대기합니다. 변경 검색 논리는 특정 인덱싱된 값에 영향을 주지 않더라도 모든 컬렉션 변경 내용에 따라 업데이트됩니다. 이는 수신 대기 논리가 컬렉션의 모든 인스턴스에서 일반적이기 때문입니다.

데이터 원본이 사전 또는 맵인 경우 속성 경로는 해당 문자열 이름으로 컬렉션의 항목을 지정할 수 있습니다. 예를 들어 <TextBlock Text="{x:Bind Players['John Smith']}" /> 는 "John Smith"라는 사전에서 항목을 찾습니다. 이름은 따옴표로 묶어야 하며 작은따옴표 또는 큰따옴표를 사용할 수 있습니다. Hat(^)을 사용하여 문자열의 따옴표를 이스케이프할 수 있습니다. 일반적으로 XAML 특성에 사용되는 것과는 다른 따옴표를 사용하는 것이 가장 쉽습니다. (IReadOnlyDictionary<T> 및 IMapView<T> 는 인덱서 구문을 지원하지 않습니다.)

문자열 인덱서 사용하려면 모델에서 인덱싱할 속성 형식에서 IDictionary<문자열, T> 또는 IMap<문자열 T> 를 구현해야 합니다. 인덱싱된 속성의 형식이 IObservableMap 을 지원하고 바인딩이 OneWay 또는 TwoWay인 경우 해당 인터페이스에서 변경 알림을 등록하고 수신 대기합니다. 변경 검색 논리는 특정 인덱싱된 값에 영향을 주지 않더라도 모든 컬렉션 변경 내용에 따라 업데이트됩니다. 이는 수신 대기 논리가 컬렉션의 모든 인스턴스에서 일반적이기 때문입니다.

연결된 속성

연결된 속성에 바인딩하려면 클래스와 속성 이름을 점 뒤의 괄호에 넣어야 합니다. 예를 들어 Text="{x:Bind Button22.(Grid.Row)}". Xaml 네임스페이스에서 속성이 선언되지 않은 경우, xml 네임스페이스를 접두사로 추가하고, 이 xml 네임스페이스를 문서 머리글의 코드 네임스페이스에 매핑해야 합니다.

캐스팅

컴파일된 바인딩은 강력한 형식이며 경로에 있는 각 단계의 형식을 확인합니다. 반환된 형식에 멤버가 없으면 컴파일 시간에 실패합니다. 개체의 실제 형식을 바인딩하도록 캐스팅을 지정할 수 있습니다.

다음 경우 obj는 개체 유형의 속성이지만 텍스트 상자를 포함하므로, Text="{x:Bind ((TextBox)obj).Text}" 또는 Text="{x:Bind obj.(TextBox.Text)}"를 사용할 수 있습니다.

groups3 필드는 Text="{x:Bind((data:SampleDataGroup)groups3[0]).Title}"에서 개체의 사전 역할을 하므로, data:SampleDataGroup으로 캐스팅해야 합니다. 개체 형식을 기본 XAML 네임스페이스에 속하지 않는 코드 네임스페이스에 매핑하기 위한 네임스페이스 접두사인 xml 데이터의 사용을 확인합니다.

참고: C#스타일 캐스트 구문은 연결된 속성 구문보다 더 유연하며 앞으로 권장되는 구문입니다.

경로 없는 캐스팅

네이티브 바인딩 파서는 함수 매개 변수로 나타내는 this 키워드를 제공하지 않지만 함수 매개 변수로 사용할 수 있는 경로 없는 캐스팅(예 {x:Bind (x:String)}: )을 지원합니다. 따라서 {x:Bind MethodName((namespace:TypeOfThis))} 개념적으로 동일한 {x:Bind MethodName(this)}것을 수행하는 유효한 방법입니다.

예제:

Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}"

<Page
    x:Class="AppSample.MainPage"
    ...
    xmlns:local="using:AppSample">

    <Grid>
        <ListView ItemsSource="{x:Bind Songs}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:SongItem">
                    <TextBlock
                        Margin="12"
                        FontSize="40"
                        Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>
namespace AppSample
{
    public class SongItem
    {
        public string TrackName { get; private set; }
        public string ArtistName { get; private set; }

        public SongItem(string trackName, string artistName)
        {
            ArtistName = artistName;
            TrackName = trackName;
        }
    }

    public sealed partial class MainPage : Page
    {
        public List<SongItem> Songs { get; }
        public MainPage()
        {
            Songs = new List<SongItem>()
            {
                new SongItem("Track 1", "Artist 1"),
                new SongItem("Track 2", "Artist 2"),
                new SongItem("Track 3", "Artist 3")
            };

            this.InitializeComponent();
        }

        public static string GenerateSongTitle(SongItem song)
        {
            return $"{song.TrackName} - {song.ArtistName}";
        }
    }
}

바인딩 경로의 함수

Windows 10 버전 1607부터 {x:Bind} 는 함수를 바인딩 경로의 리프 단계로 사용할 수 있습니다. 이 기능은 마크업에서 여러 시나리오를 지원하는 강력한 데이터 바인딩 기능입니다. 자세한 내용은 함수 바인딩을 참조하세요.

이벤트 바인딩

이벤트 바인딩은 컴파일된 바인딩에 대한 고유한 기능입니다. 이를 통해 코드 숨김의 메서드가 아닌 바인딩을 사용하여 이벤트에 대한 처리기를 지정할 수 있습니다. 예: Click="{x:Bind rootFrame.GoForward}".

이벤트의 경우 대상 메서드가 오버로드되지 않아야 하며 다음도 수행해야 합니다.

  • 이벤트의 서명을 확인하십시오.
  • 또는 매개 변수가 없습니다.
  • 또는 이벤트 매개 변수의 형식에서 할당할 수 있는 형식의 매개 변수가 동일한 수를 가져야 합니다.

생성된 코드-비하인드에서 컴파일된 바인딩 처리는 이벤트를 처리하고, 그것을 모델의 메서드로 라우팅하여 이벤트가 발생할 때 바인딩 식의 경로를 평가합니다. 즉, 속성 바인딩과 달리 모델의 변경 내용을 추적하지 않습니다.

속성 경로의 문자열 구문에 대한 자세한 내용은 {x:Bind}에 대해 여기에 설명된 차이점을 염두에 두고 속성 경로 구문을 참조하세요.

{x:Bind}를 사용하여 설정할 수 있는 속성

태그 확장에 설정할 수 있는 읽기/쓰기 속성이 여러 개 있으므로 {x:Bind}bindingProperties 자리 표시자 구문과 함께 설명됩니다. 속성은 쉼표로 구분된 propName= 쌍을 사용하여 순서에 따라 설정할 수 있습니다. 바인딩 식에는 줄 바꿈을 포함할 수 없습니다. 일부 속성에는 형식 변환이 없는 형식이 필요하므로 {x:Bind}에 중첩된 자체의 태그 확장이 필요합니다.

이러한 속성은 Binding 클래스의 속성과 거의 동일한 방식으로 작동합니다.

재산 Description
Path 위의 속성 경로 섹션을 참조하세요.
변환기 바인딩 엔진에서 호출되는 변환기 개체를 지정합니다. 변환기는 XAML에서 설정할 수 있지만 리소스 사전의 해당 개체에 대한 {StaticResource} 태그 확장 참조에서 할당한 개체 인스턴스를 참조하는 경우에만 설정할 수 있습니다.
ConverterLanguage 변환기에서 사용할 문화권을 지정합니다. ( ConverterLanguage 를 설정하는 경우 Converter도 설정해야 합니다.) 문화권은 표준 기반 식별자로 설정됩니다. 자세한 내용은 ConverterLanguage를 참조하세요.
ConverterParameter 변환기 논리에 사용할 수 있는 변환기 매개 변수를 지정합니다. ( ConverterParameter를 설정하는 경우 Converter도 설정해야 합니다.) 대부분의 변환기는 변환하기 위해 전달된 값에서 필요한 모든 정보를 가져오는 간단한 논리를 사용하며 ConverterParameter 값이 필요하지 않습니다. ConverterParameter 매개 변수는 ConverterParameter에서 전달된 내용을 해제하는 둘 이상의 논리가 있는 보통 고급 변환기 구현을 위한 것입니다. 문자열 이외의 값을 사용하는 변환기를 작성할 수 있지만 일반적이지는 않습니다. 자세한 내용은 ConverterParameter 의 비고를 참조하세요.
FallbackValue 원본 또는 경로를 확인할 수 없는 경우 표시할 값을 지정합니다.
모드 바인딩 모드를 "OneTime", "OneWay" 또는 "TwoWay" 문자열 중 하나로 지정합니다. 기본값은 "OneTime"입니다. 대부분의 경우 "OneWay"인 {Binding}의 기본값과 다릅니다.
TargetNullValue 원본 값이 확인되지만 명시적으로 null일 때 표시할 값을 지정합니다.
BindBack 양방향 바인딩의 역방향에 사용할 함수를 지정합니다.
UpdateSourceTrigger TwoWay 바인딩에서 컨트롤에서 모델로 변경 내용을 다시 푸시할 시기를 지정합니다. TextBox.Text를 제외한 모든 속성의 기본값은 PropertyChanged입니다. TextBox.Text는 LostFocus입니다.

비고

태그를 {Binding} 에서 {x:Bind}로 변환하는 경우 Mode 속성의 기본값 차이에 유의하세요. x:DefaultBindMode 를 사용하여 태그 트리의 특정 세그먼트에 대한 x:Bind의 기본 모드를 변경할 수 있습니다. 선택한 모드는 바인딩의 일부로 모드를 명시적으로 지정하지 않는 해당 요소 및 해당 자식에 x:Bind 식을 적용합니다. OneWay를 사용하면 변경 내용 검색을 연결하고 처리하기 위해 더 많은 코드가 생성되므로 OneTime은 OneWay보다 성능이 더 높습니다.

비고

{x:Bind}는 생성된 코드를 사용하여 이점을 얻기 때문에 컴파일 시간에 형식 정보가 필요합니다. 즉, 형식을 미리 모르는 속성에 바인딩할 수 없습니다. 이 때문에 DataContext 속성과 함께 {x:Bind}을(를) 사용할 수 없습니다. 이 속성은 개체 형식이며 런타임에 변경될 수도 있습니다.

데이터 템플릿과 함께 {x:Bind}를 사용하는 경우 예제 섹션에 표시된 것처럼 x:DataType 값을 설정하여 바인딩되는 형식을 나타내야 합니다. 형식을 인터페이스 또는 기본 클래스 형식으로 설정한 다음 필요한 경우 캐스트를 사용하여 전체 식을 작성할 수도 있습니다.

컴파일된 바인딩은 코드 생성에 따라 달라집니다. 따라서 리소스 사전에서 {x:Bind} 를 사용하는 경우 리소스 사전에 코드 숨김 클래스가 있어야 합니다. 코드 예제를 위해 {x:Bind}가 있는 리소스 사전을 참조하세요.

컴파일된 바인딩을 포함하는 페이지 및 사용자 컨트롤에는 생성된 코드에 "Bindings" 속성이 포함됩니다. 여기에는 다음 메서드가 포함됩니다.

  • Update() - 컴파일된 모든 바인딩의 값을 업데이트합니다. 단방향/양방향 바인딩은 리스너를 연동하여 변경 사항을 감지합니다.
  • Initialize() - 바인딩이 아직 초기화되지 않은 경우 Update()를 호출하여 바인딩을 초기화합니다.
  • StopTracking() - 단방향 및 양방향 바인딩에 대해 만든 모든 수신기를 해제합니다. Update() 메서드를 사용하여 다시 초기화할 수 있습니다.

비고

Windows 10 버전 1607부터 XAML 프레임워크에는 부울 값을 Visibility 형식으로 변환하는 기본 제공 변환기가 포함됩니다. 변환기는 trueVisible 열거형 값에, falseCollapsed에 매핑하여 변환기를 만들지 않고 Visibility 속성을 Boolean에 바인딩할 수 있도록 합니다. 이는 함수 바인딩의 기능이 아니라 속성 바인딩만을 수행합니다. 기본 제공 변환기를 사용하려면 앱의 최소 대상 SDK 버전은 14393 이상이어야 합니다. 앱이 이전 버전의 Windows 10을 대상으로 하는 경우에는 사용할 수 없습니다. 대상 버전에 대한 자세한 내용은 버전 적응 코드를 참조하세요.

팁 (조언)

Path 또는 ConverterParameter와 같은 값에 단일 중괄호를 지정해야 하는 경우, 중괄호 앞에 백슬래시를 붙입니다\{. 또는 보조 따옴표 집합에서 이스케이프해야 하는 중괄호가 포함된 전체 문자열을 묶습니다. 예를 들면 다음과 같습니다 ConverterParameter='{Mix}'.

Converter, ConverterLanguageConverterLanguage 는 모두 바인딩 소스에서 바인딩 대상 속성과 호환되는 형식 또는 값으로 값 또는 형식을 변환하는 시나리오와 관련이 있습니다. 자세한 내용 및 예제는 데이터 바인딩의 "데이터 변환" 섹션 을 자세히 참조하세요.

{x:Bind} 는 태그 확장에만 해당 바인딩을 프로그래밍 방식으로 만들거나 조작할 수 있는 방법이 없습니다. 태그 확장에 대한 자세한 내용은 XAML 개요를 참조하세요.