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