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