在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
无效。这是转换器代码:
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));
}
答案 0 :(得分:14)
如果您使用 x:Bind
,则Source
的{{1}}需要绑定到完全相同类型Image
的属性(例如ImageSource
而不是BitmapImage
,否则它将抛出编译时错误,这正是编译时绑定应该做的。旧绑定允许字符串',因为它使用 Reflection 在运行时为您解析类型。
原来我的显式类型理论是错误的(感谢@igrali指出它)。只要string
不是Source
或string
,null
确实会占用''
。因此,我们有两种方法可以解决这个问题。
选项1
将uri
作为string
保留,但检查vm
后,null
或''
,返回一些虚拟文字(甚至返回一个字母x
会起作用!)。
选项2
将uri
从字符串更改为 BitmapImage 。然后,您可以使用TargetNullValue
和FallbackValue
来处理空值和无效绑定。
... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"