x:用空string绑定图像

在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作品。
  • 你可以使用@ Justin-xl提到的任何方法。 对我来说,改变所有虚拟机停止返回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 ,则ImageSource需要绑定到完全相同类型的ImageSource (例如BitmapImage )的属性而不是string ,否则会引发编译时错误,这正是编译时绑定应该这样做。 旧的绑定允许字符串 ,因为它使用反射在运行时解析你的类型。

原来我明确的类型理论是错误的(感谢@igrali指出)。 只要不是null或者''Source接受一个string 。 所以我们有两个选择来解决这个问题。

选项1

把你的uri保存为一个string ,但是在vm检查一下,一旦它为null或者返回一些虚拟文本(即使返回一个字母x也可以)。

选项2

uri字符串更改为BitmapImage 。 然后,您可以使用TargetNullValueFallbackValue来处理空值和无效绑定。

 ... FallbackValue='http://img.zgserver.com/c%23/SplashScreen.png' TargetNullValue='http://img.zgserver.com/c%23/SplashScreen.png'}"