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?


ОБНОВЛЕНИЕ:

Благодаря ответившим пользователям, сделан следующий вывод (для 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));
}

person Saurabh3321    schedule 08.08.2015    source источник


Ответы (1)


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

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

Вариант 1

Оставьте свой uri как string, но проверьте свой vm, как только он станет null или '', верните какой-нибудь фиктивный текст (даже возврат буквы x будет работать!).

Вариант 2

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

... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"
person Justin XL    schedule 08.08.2015
comment
Несмотря на то, что в этом конкретном случае нулевая строка вызывает проблемы, технически использование {x:Bind } для привязки к строкам с допустимым изображением Uris все равно будет работать. - person Igor Ralic; 09.08.2015
comment
@igrali знаешь что, я только что проверил это с твоей стороны! Интересно, хотя для этого нужен действительный URL-адрес, иначе он выдаст ошибку времени компиляции. Я обновлю ответ. - person Justin XL; 09.08.2015
comment
@igrali, похоже, ему даже не нужен действительный uri, пока он не пуст, он не будет выдавать ошибок времени компиляции! - person Justin XL; 09.08.2015
comment
Спасибо оба варианта сработали. Интересно, почему они изменили преобразователь по умолчанию, который срабатывает при привязке строки. Кажется, он не обрабатывает нулевую или пустую строку. Следовательно, даже одно пространство работает - person Saurabh3321; 09.08.2015
comment
Не совсем уверен, но это может быть ошибка в их коде преобразования? - person Justin XL; 09.08.2015
comment
Да похоже. Интересно, почему никто не указал на это. Я сделал вывод выше вместе с вариантом ручного конвертера для решения этой проблемы. Изменение кода везде в vm было для меня утомительным, так как я использую много нулевых привязок. - person Saurabh3321; 09.08.2015
comment
Спасибо @JustinXL, вы спасли мой день! - person Sapan Ghafuri; 02.08.2016