在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;
}
}
应用程序编译正常,但是在执行过程中(由于在几秒钟后填充了数据),应用程序崩溃并发生以下异常:
调试器在以下位置中断:
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(?)中只能将字符串绑定(bind)到图像源,我只想在数据填充之前留白的空白区域,因此,我不希望将本地镜像源作为备用。有人可以帮我移植到Win 10吗?
更新:
感谢用户的回答,得出以下结论(针对UWP):
string
,则不能是null
或空
""
。单字符"x"
或空格" "
都可以使用。 BitmapImage
,则返回null
即可。 更改所有虚拟机以停止返回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));
}
最佳答案
如果使用x:Bind
,那么Source
的Image
需要绑定(bind)到类型完全相同的属性ImageSource
(例如BitmapImage
),而不是string
,否则它将引发编译时错误,这恰好是编译时绑定(bind)去做。旧的绑定(bind)允许使用字符串,因为它在运行时使用反射为您解析类型。
原来我的显式类型理论是错误的(感谢@igrali指出了这一点)。只要不是Source
或string
,null
都会接受''
。因此,我们有两个解决方案。
选项1
将uri
保留为string
,但是请检查vm
,一旦它是null
或''
,则返回一些伪文本(即使返回字母x
也可以!)。
选项2
将uri
从字符串更改为 BitmapImage 。然后,您可以使用TargetNullValue
和FallbackValue
处理null和无效绑定(bind)。
... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"
关于c# - x :Bind image with null string,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31897154/