Xamarin.Forms 바인딩 대체

Download Sample 샘플 다운로드

바인딩 소스를 확인할 수 없거나 바인딩에 성공하지만 null 값을 반환하기 때문에 경우에 따라 데이터 바인딩이 실패합니다. 값 변환기 또는 기타 추가 코드를 사용하여 이러한 시나리오를 처리할 수 있고 데이터 바인딩은 바인딩 프로세스에 실패하는 경우 사용할 대체 값을 정의하여 더 강력하게 만들 수 있습니다. 바인딩 식에서 FallbackValueTargetNullValue 속성을 정의하여 이 작업을 수행할 수 있습니다. 이러한 속성이 BindingBase 클래스에 위치하기 때문에, 바인딩, 다중 바인딩, 컴파일된 바인딩 및 Binding 태그 확장과 함께 사용할 수 있습니다.

참고 항목

바인딩 식에서 FallbackValueTargetNullValue 속성을 사용하는 것은 선택 사항입니다.

대체 값 정의

FallbackValue 속성을 사용하면 바인딩 소스를 확인할 수 없을 때 사용되는 대체 값을 정의할 수 있습니다. 이 속성을 설정하는 일반적인 시나리오는 유형이 다른 바인딩된 컬렉션의 모든 개체에 존재하지 않을 수 있는 원본 속성에 바인딩된 경우입니다.

MonkeyDetail 페이지는 FallbackValue 속성을 설정하는 방법을 보여줍니다.

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

Label에 대한 바인딩은 바인딩 소스를 확인할 수 없는 경우 대상에서 설정할 수 있는 FallbackValue 값을 정의합니다. 따라서 FallbackValue 속성에 정의된 값은 Population 속성이 바인딩된 개체에 존재하지 않는 경우 표시됩니다. 여기에서 FallbackValue 속성 값은 작은따옴표(아포스트로피) 문자로 구분됩니다.

FallbackValue 속성 값을 인라인으로 정의하는 대신 ResourceDictionary에서 리소스로 정의하는 것이 좋습니다. 이 방식은 이러한 값을 단일 위치에서 한 번 정의하고 쉽게 지역화할 수 있다는 장점이 있습니다. 그런 다음, StaticResource 태그 확장을 사용하여 리소스를 검색할 수 있습니다.

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

참고 항목

바인딩 식을 사용하여 FallbackValue 속성을 설정할 수 없습니다.

실행 중인 프로그램은 다음과 같습니다.

FallbackValue Binding

FallbackValue 속성이 바인딩 식에서 설정되어 있지 않고 바인딩 경로 또는 경로의 일부가 확인되지 않은 경우 대상에서 BindableProperty.DefaultValue를 설정합니다. 그러나 FallbackValue 속성이 설정되고 바인딩 경로 또는 경로의 일부가 확인되지 않은 경우 대상에서 FallbackValue 값 속성을 설정합니다. 따라서 바인딩된 개체에 Population 속성이 없기 때문에 MonkeyDetail 페이지에서 Label은 "알 수 없는 모집단 크기"라고 표시합니다.

Important

FallbackValue 속성을 설정한 경우 바인딩 식에서 정의된 값 변환기가 실행되지 않습니다.

Null 대체 값 정의

TargetNullValue 속성을 사용하면 바인딩 소스를 확인할 수 없지만 값이 null일 때 사용되는 대체 값을 정의할 수 있습니다. 이 속성을 설정하는 일반적인 시나리오는 바인딩된 컬렉션에서 null일 수 있는 원본 속성에 바인딩된 경우입니다.

Monkeys 페이지는 TargetNullValue 속성을 설정하는 방법을 보여줍니다.

<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 값을 정의합니다. 따라서 ImageUrlLocation 속성을 정의하지 않은 경우 컬렉션의 모든 개체에 TargetNullValue 속성에 정의된 값이 표시됩니다. 여기에서 TargetNullValue 속성 값은 작은따옴표(아포스트로피) 문자로 구분됩니다.

TargetNullValue 속성 값을 인라인으로 정의하는 대신 ResourceDictionary에서 리소스로 정의하는 것이 좋습니다. 이 방식은 이러한 값을 단일 위치에서 한 번 정의하고 쉽게 지역화할 수 있다는 장점이 있습니다. 그런 다음, StaticResource 태그 확장을 사용하여 리소스를 검색할 수 있습니다.

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

참고 항목

바인딩 식을 사용하여 TargetNullValue 속성을 설정할 수 없습니다.

실행 중인 프로그램은 다음과 같습니다.

TargetNullValue Binding

바인딩 식에서 TargetNullValue 속성을 설정하지 않으면 null라는 원본 값은 값 변환기가 정의된 경우 변환되고, StringFormat이 정의된 경우 서식이 지정됩니다. 그런 다음, 대상에 대한 결과가 설정됩니다. 그러나 TargetNullValue 속성이 설정되어 있는 경우 null의 원본 값은 값 변환기가 정의된 경우 변환되고, 변환 후에 여전히 null인 경우 대상에 대한 TargetNullValue 속성 값이 설정됩니다.

Important

TargetNullValue 속성을 설정한 경우 바인딩 식에서 문자열 서식 지정이 적용되지 않습니다.