티스토리 뷰

반응형

앱을 개발하기 시작하는 단계에서는 빌드 에러 이외에는 크게 신경을 쓰지 않는다. 그러나, 어느 정도 앱이 완성이 된 후에는 주의!라고 뜨는 에러 메시지도 신경을 써 주어야 한다.


그 중에 BindingExpression 에러가 대표적인 그런 종류의 에러라고 할 수 있는데. 딱히 빌드 오류가 발생하지는 않치만, Debug output 창을 한가득 체운다면 상당히 기분이 더럽다.


그렇치 않은가??



에러 내용은 아래와 같다.


Error: Converter failed to convert value of type 'String' to type 'ImageSource'; BindingExpression: Path='BaseImageUri' DataItem='CrossPlatform.Universal.PCL.Models.SkyDriveFolderM'; target element is 'Windows.UI.Xaml.Controls.Image' (Name='null'); target property is 'Source' (type 'ImageSource').


에러 메시지의 내용은 BaseImageUri라는 string 프로퍼티를 Image 컨트롤의 ImageSource에 바인딩 해 놓았는데, BaseImageUri가 null이라서 컨버팅을 할 수 없다는 내용의 오류이다.


BaseImageUri라는 프로퍼티가 항상 값을 가진다면, 저런 오류가 나지 않겠지만, 저 프로퍼티는 원래 값이 존재할 수도, 존재하지 않을 수도 있다는 것이다.


문제의 xaml 코드


<Image VerticalAlignment="Center" Margin="11,21,11,44" HorizontalAlignment="Center" Source="{Binding BaseImageUri" Stretch="UniformToFill"/>



어떻게 이런 메시지가 출력되지 않도록 할 수 있을까?



아래 내용을 참고하자.

DependencyProperty.UnsetValue Field

https://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue(v=vs.110).aspx




문제 해결을 위해 간단하게 Converter를 하나 만들자.

    public class StringToImageSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (string.IsNullOrEmpty(value as string)) return DependencyProperty.UnsetValue;
            return value.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }


그리고, 위의 xaml 코드를 컨버터를 사용하도록 변경한다.


<Image VerticalAlignment="Center" Margin="11,21,11,44" HorizontalAlignment="Center" Source="{Binding BaseImageUri, Converter={StaticResource StringToImageSourceConverter}}" Stretch="UniformToFill"/>


그리고 실행하면, 에러 메시지가 더 이상 출력되지 않는 것을 알 수 있다.


반응형
댓글