C# x:使用空字符串绑定图像
在XAML中,我有以下行: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:参数不正确 调试器在以下位置中断:
<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'}"