В 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));
}