在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:参数不正确。
debugging器打破:
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导致编译时间错误。 我相信只有string可以绑定到图像源在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)); }
如果使用 x:Bind
,则Image
的Source
需要绑定到完全相同类型的ImageSource
(例如BitmapImage
)的属性而不是string
,否则会引发编译时错误,这正是编译时绑定应该这样做。旧的绑定允许字符串 ,因为它使用反射在运行时解析你的类型。
原来我明确的类型理论是错误的(感谢@igrali指出)。 只要不是null
或者''
, Source
接受一个string
。 所以我们有两个选择来解决这个问题。
选项1
把你的uri
保存为一个string
,但是在vm
检查一下,一旦它为null
或者返回一些虚拟文本(即使返回一个字母x
也可以)。
选项2
将uri
从字符串更改为BitmapImage 。 然后,您可以使用TargetNullValue
和FallbackValue
来处理空值和无效绑定。
... FallbackValue='http://img.zgserver.com/c%23/SplashScreen.png' TargetNullValue='http://img.zgserver.com/c%23/SplashScreen.png'}"