将图像与空字符串绑定

15
在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));
}
1个回答

15

如果使用x:Bind,则需要将ImageSource绑定到完全相同类型的属性ImageSource(例如BitmapImage)而不是string,否则它会抛出编译时错误,这正是编译时绑定应该做的事情。旧的绑定允许使用字符串因为它在运行时使用反射为您解析类型。

结果证明我的显式类型理论是错误的(感谢@igrali指出)。只要Source不是null'',它确实可以使用string。因此我们有两个选项来解决这个问题。

选项1

uri保持为string,但在vm中进行检查,一旦它为null'',返回一些虚拟文本(即使返回一个字母x也可以工作!)。

选项2

uristring更改为BitmapImage。然后你可以使用TargetNullValueFallbackValue处理null和无效的绑定。

... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"

1
尽管在这种特定情况下,空字符串会导致问题,但从技术上讲,使用{x:Bind}绑定到具有有效图像URI的字符串仍然可以工作。 - Igor Ralic
1
@igrali,看起来它甚至不需要一个有效的URI,只要它不为空,它就不会抛出编译时错误! - Justin XL
1
谢谢,两个选项都有效。我想知道他们为什么改变了绑定字符串时默认的转换器。它似乎不能处理null或空字符串。因此,即使是一个单独的空格“ ”也可以起作用。 - Saurabh3321
1
是的,看起来是这样。我想知道为什么没有人指出这一点。我已经在上面放了一个结论,并提供了一个手动转换选项来解决这个问题。在虚拟机中到处更改代码对我来说很繁琐,因为我使用了很多空绑定。 - Saurabh3321
1
谢谢 @JustinXL,你救了我的一天! - Sapan Ghafuri
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接