Xamarin.Forms 바인딩 대체Xamarin.Forms Binding Fallbacks

샘플 다운로드 샘플 다운로드Download Sample Download the sample

바인딩 소스를 확인할 수 없거나 바인딩에 성공하지만 null 값을 반환하기 때문에 경우에 따라 데이터 바인딩이 실패합니다.Sometimes data bindings fail, because the binding source can't be resolved, or because the binding succeeds but returns a null value. 값 변환기 또는 기타 추가 코드를 사용하여 이러한 시나리오를 처리할 수 있고 데이터 바인딩은 바인딩 프로세스에 실패하는 경우 사용할 대체 값을 정의하여 더 강력하게 만들 수 있습니다.While these scenarios can be handled with value converters, or other additional code, data bindings can be made more robust by defining fallback values to use if the binding process fails. 바인딩 식에서 FallbackValueTargetNullValue 속성을 정의하여 이 작업을 수행할 수 있습니다.This can be accomplished by defining the FallbackValue and TargetNullValue properties in a binding expression. 이러한 속성이 BindingBase 클래스에 위치하기 때문에 바인딩, 컴파일된 바인딩 및 Binding 태그 확장과 함께 사용할 수 있습니다.Because these properties reside in the BindingBase class, they can be used with bindings, compiled bindings, and with the Binding markup extension.

참고

바인딩 식에서 FallbackValueTargetNullValue 속성을 사용하는 것은 선택 사항입니다.Use of the FallbackValue and TargetNullValue properties in a binding expression is optional.

대체 값 정의Defining a fallback value

FallbackValue 속성을 사용하면 바인딩 소스를 확인할 수 없을 때 사용되는 대체 값을 정의할 수 있습니다.The FallbackValue property allows a fallback value to be defined that will be used when the binding source can't be resolved. 이 속성을 설정하는 일반적인 시나리오는 유형이 다른 바인딩된 컬렉션의 모든 개체에 존재하지 않을 수 있는 원본 속성에 바인딩된 경우입니다.A common scenario for setting this property is when binding to source properties that might not exist on all objects in a bound collection of heterogeneous types.

MonkeyDetail 페이지는 FallbackValue 속성을 설정하는 방법을 보여줍니다.The MonkeyDetail page illustrates setting the FallbackValue property:

<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
       ... />   

Label에 대한 바인딩은 바인딩 소스를 확인할 수 없는 경우 대상에서 설정할 수 있는 FallbackValue 값을 정의합니다.The binding on the Label defines a FallbackValue value that will be set on the target if the binding source can't be resolved. 따라서 FallbackValue 속성에 정의된 값은 Population 속성이 바인딩된 개체에 존재하지 않는 경우 표시됩니다.Therefore, the value defined by the FallbackValue property will be displayed if the Population property doesn't exist on the bound object. 여기에서 FallbackValue 속성 값은 작은따옴표(아포스트로피) 문자로 구분됩니다.Notice that here the FallbackValue property value is delimited by single-quote (apostrophe) characters.

FallbackValue 속성 값을 인라인으로 정의하는 대신 ResourceDictionary에서 리소스로 정의하는 것이 좋습니다.Rather than defining FallbackValue property values inline, it's recommended to define them as resources in a ResourceDictionary. 이 방식은 이러한 값을 단일 위치에서 한 번 정의하고 쉽게 지역화할 수 있다는 장점이 있습니다.The advantage of this approach is that such values are defined once in a single location, and are more easily localizable. 그런 다음, StaticResource 태그 확장을 사용하여 리소스를 검색할 수 있습니다.The resources can then be retrieved using the StaticResource markup extension:

<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
       ... />  

참고

바인딩 식을 사용하여 FallbackValue 속성을 설정할 수 없습니다.It's not possible to set the FallbackValue property with a binding expression.

실행 중인 프로그램은 다음과 같습니다.Here's the program running:

FallbackValue 바인딩FallbackValue Binding

FallbackValue 속성이 바인딩 식에서 설정되어 있지 않고 바인딩 경로 또는 경로의 일부가 확인되지 않은 경우 대상에서 BindableProperty.DefaultValue를 설정합니다.When the FallbackValue property isn't set in a binding expression and the binding path or part of the path isn't resolved, BindableProperty.DefaultValue is set on the target. 그러나 FallbackValue 속성이 설정되고 바인딩 경로 또는 경로의 일부가 확인되지 않은 경우 대상에서 FallbackValue 값 속성을 설정합니다.However, when the FallbackValue property is set and the binding path or part of the path isn't resolved, the value of the FallbackValue value property is set on the target. 따라서 바인딩된 개체에 Population 속성이 없기 때문에 MonkeyDetail 페이지에서 Label은 "알 수 없는 모집단 크기"라고 표시합니다.Therefore, on the MonkeyDetail page the Label displays "Population size unknown" because the bound object lacks a Population property.

중요

FallbackValue 속성을 설정한 경우 바인딩 식에서 정의된 값 변환기가 실행되지 않습니다.A defined value converter is not executed in a binding expression when the FallbackValue property is set.

Null 대체 값 정의Defining a null replacement value

TargetNullValue 속성을 사용하면 바인딩 소스를 확인할 수 없지만 값이 null일 때 사용되는 대체 값을 정의할 수 있습니다.The TargetNullValue property allows a replacement value to be defined that will be used when the binding source is resolved, but the value is null. 이 속성을 설정하는 일반적인 시나리오는 바인딩된 컬렉션에서 null일 수 있는 원본 속성에 바인딩된 경우입니다.A common scenario for setting this property is when binding to source properties that might be null in a bound collection.

Monkeys 페이지는 TargetNullValue 속성을 설정하는 방법을 보여줍니다.The Monkeys page illustrates setting the TargetNullValue property:

<ListView ItemsSource="{Binding Monkeys}"
          ...>
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid>
                    ...
                    <Image Source="{Binding ImageUrl, TargetNullValue='https://upload.wikimedia.org/wikipedia/commons/2/20/Point_d_interrogation.jpg'}"
                           ... />
                    ...
                    <Label Text="{Binding Location, TargetNullValue='Location unknown'}"
                           ... />
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ImageLabel에 대한 바인딩은 모두 바인딩 경로가 null을 반환하는 경우 적용되는 TargetNullValue 값을 정의합니다.The bindings on the Image and Label both define TargetNullValue values that will be applied if the binding path returns null. 따라서 ImageUrlLocation 속성을 정의하지 않은 경우 컬렉션의 모든 개체에 TargetNullValue 속성에 정의된 값이 표시됩니다.Therefore, the values defined by the TargetNullValue properties will be displayed for any objects in the collection where the ImageUrl and Location properties are not defined. 여기에서 TargetNullValue 속성 값은 작은따옴표(아포스트로피) 문자로 구분됩니다.Notice that here the TargetNullValue property values are delimited by single-quote (apostrophe) characters.

TargetNullValue 속성 값을 인라인으로 정의하는 대신 ResourceDictionary에서 리소스로 정의하는 것이 좋습니다.Rather than defining TargetNullValue property values inline, it's recommended to define them as resources in a ResourceDictionary. 이 방식은 이러한 값을 단일 위치에서 한 번 정의하고 쉽게 지역화할 수 있다는 장점이 있습니다.The advantage of this approach is that such values are defined once in a single location, and are more easily localizable. 그런 다음, StaticResource 태그 확장을 사용하여 리소스를 검색할 수 있습니다.The resources can then be retrieved using the StaticResource markup extension:

<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
       ... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
       ... />

참고

바인딩 식을 사용하여 TargetNullValue 속성을 설정할 수 없습니다.It's not possible to set the TargetNullValue property with a binding expression.

실행 중인 프로그램은 다음과 같습니다.Here's the program running:

TargetNullValue 바인딩TargetNullValue Binding

바인딩 식에서 TargetNullValue 속성을 설정하지 않으면 null라는 원본 값은 값 변환기가 정의된 경우 변환되고, StringFormat이 정의된 경우 서식이 지정됩니다. 그런 다음, 대상에 대한 결과가 설정됩니다.When the TargetNullValue property isn't set in a binding expression, a source value of null will be converted if a value converter is defined, formatted if a StringFormat is defined, and the result is then set on the target. 그러나 TargetNullValue 속성이 설정되어 있는 경우 null의 원본 값은 값 변환기가 정의된 경우 변환되고, 변환 후에 여전히 null인 경우 대상에 대한 TargetNullValue 속성 값이 설정됩니다.However, when the TargetNullValue property is set, a source value of null will be converted if a value converter is defined, and if it's still null after the conversion, the value of the TargetNullValue property is set on the target.

중요

TargetNullValue 속성을 설정한 경우 바인딩 식에서 문자열 서식 지정이 적용되지 않습니다.String formatting is not applied in a binding expression when the TargetNullValue property is set.