C# x:使用空字符串绑定图像

C# x:使用空字符串绑定图像,c#,windows,windows-10,uwp,windows-10-mobile,C#,Windows,Windows 10,Uwp,Windows 10 Mobile,在XAML中,我有以下行: <Image x:Name="MainImage" Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}" Stretch="UniformToFill"/> 应用程序编译良好,但在执行期间(因为数据在几秒钟后填充),应用程序崩溃,出现以下异常: System.ArgumentException:参数不正确 调试器在以下位置中断:

在XAML中,我有以下行:

<Image x:Name="MainImage" 
       Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}"
       Stretch="UniformToFill"/>
应用程序编译良好,但在执行期间(因为数据在几秒钟后填充),应用程序崩溃,出现以下异常:

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);
                }
            }
如果使用
x:Bind
,则
图像的
需要绑定到与
图像源
类型完全相同的属性(例如
位图图像
),而不是
字符串
,否则它将抛出编译时错误,这正是编译时绑定应该做的。旧绑定允许字符串,因为它在运行时使用反射为您解析类型

结果证明我的显式类型理论是错误的(多亏@igrali指出了这一点)。
源代码
不接受
字符串
,只要它不是
null
'
。因此,我们有两种选择来解决这个问题

选项1

将您的
uri
保留为
string
,但在
vm
中进行检查,一旦
null
'
,返回一些虚拟文本(即使返回字母
x
也可以!)

选项2

uri
从字符串更改为位图图像。然后可以使用
TargetNullValue
FallbackValue
处理空值和无效绑定

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

即使在这种特殊情况下,空字符串会导致问题,但从技术上讲,使用{x:Bind}绑定到具有有效图像uri的字符串仍然有效。@igrali,看起来它甚至不需要有效的uri,只要它不是空的,就不会抛出编译时错误!谢谢,两种选择都有效。我想知道为什么他们更改了绑定字符串时启动的默认转换器。它似乎不能处理null或空字符串。因此,即使只有一个空间“”也可以正常工作。我想知道为什么没有人指出这一点。我在上面给出了一个结论,以及一个手动转换器选项来解决这个问题。因为我使用了很多空绑定,所以在vm中到处更改代码对我来说很乏味。谢谢@JustinXL,你救了我一天!
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));
}
... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"