在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):
  • 如果要将图像源绑定(bind)到string,则不能是null
    ""。单字符"x"或空格" "都可以使用。
  • 如果绑定(bind)到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,那么SourceImage需要绑定(bind)到类型完全相同的属性ImageSource(例如BitmapImage),而不是string,否则它将引发编译时错误,这恰好是编译时绑定(bind)去做。旧的绑定(bind)允许使用字符串,因为它在运行时使用反射为您解析类型。

    原来我的显式类型理论是错误的(感谢@igrali指出了这一点)。只要不是Sourcestringnull都会接受''。因此,我们有两个解决方案。

    选项1

    uri保留为string,但是请检查vm,一旦它是null'',则返回一些伪文本(即使返回字母x也可以!)。

    选项2

    uri从字符串更改为 BitmapImage 。然后,您可以使用TargetNullValueFallbackValue处理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/

    10-17 02:44