X: привязать изображение с нулевой строкой

В XAML у меня есть следующая строка:

<Image x:Name="MainImage" 
       Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}"
       Stretch="UniformToFill"/>

В ViewModel:

public string MainPic
{
    get
    {
        if (Data == null)
            return default(string);
        else
            return Data.Photos.ElementAtOrDefault(0).url;
    }
}

Приложение компилируется отлично, но во время выполнения (поскольку данные заполняются через несколько секунд), приложение вылетает со следующим исключением:

System.ArgumentException: параметр неверен.

Отладчик разбивается на:

            private void Update_ViewModel_MainPic(global::System.String obj, int phase)
            {
                if((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0)
                {
 /*HERE>>*/          XamlBindingSetters.Set_Windows_UI_Xaml_Controls_Image_Source(this.obj23, (global::Windows.UI.Xaml.Media.ImageSource) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.Media.ImageSource), obj), null);
                }
            }

По-видимому, это происходит, поскольку MainPic возвращает null.

Теперь этот код отлично работает в WP8.1. Я попытался вернуть uri, что приводит к ошибке времени компиляции. Я считаю, что только строка может быть привязана к источнику изображения в Win 10 (?). Мне просто нужна пустая белая область, пока данные не будут заполнены, поэтому я не хочу давать локальный источник изображения в качестве резервной копии. Может кто-нибудь помочь мне передать это для Win 10?


UPDATE:

Благодаря пользователям, которые ответили, следующий вывод сделан (для UWP):

  • Если вы привязываете источник изображения к string, он не может быть null или пустой "". Будет работать одиночный символ "x" или пробел " ".
  • Если вы привязываетесь к BitmapImage, возвращается null.
  • Вы можете использовать любой из методов, упомянутых @Justin-xl. Для меня, изменить все vm, чтобы остановить возврат null, было сложно. Поэтому добавление простого конвертер в xaml также делает трюк.

Здесь код конвертера:

public object Convert(object value, Type targetType, object parameter, string language)
{
    if (string.IsNullOrEmpty(value as string))
    {
        return null;
    }
    else return new BitmapImage(new Uri(value as string, UriKind.Absolute));
}

Ответ 1

Если вы используете x:Bind, Source для Image необходимо привязать к свойству того же типа ImageSource (например, BitmapImage) вместо string, в противном случае будет вызывать ошибку времени компиляции, которая должна выполняться в точности с момента компиляции. Старое связывание позволяет использовать строки, потому что использует Reflection для разрешения типа для вас во время выполнения.

Оказывается, моя явная теория типов была неправильной (спасибо @igrali за указание). Source принимает значение string, пока оно не null или ''. Таким образом, это оставляет нам два варианта, чтобы исправить это.

Вариант 1

Сохраните uri как string, но сделайте чек в своем vm, после того, как он null или '', вернет некоторый фиктивный текст (даже вернув письмо x будет работать!).

Вариант 2

Измените uri на строку BitmapImage. Затем вы можете использовать TargetNullValue и FallbackValue для обработки нулей и недопустимых привязок.

... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"