x:Bind 包含空字符串的图像
x:Bind image with null string
在 XAML 我有以下行:
<Image x:Name="MainImage"
Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}"
Stretch="UniformToFill"/>
在视图模型中:
public string MainPic
{
get
{
if (Data == null)
return default(string);
else
return Data.Photos.ElementAtOrDefault(0).url;
}
}
应用程序编译正常,但在执行期间(因为数据在几秒后填充),应用程序崩溃并出现以下异常:
System.ArgumentException: The parameter is incorrect.
调试器中断于:
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"
或 space " "
都可以。
- 如果绑定到
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
,Image
的 Source
需要绑定到完全相同类型的 属性 ImageSource
(例如 BitmapImage
)而不是 string
,否则它会抛出一个编译时错误,这正是编译时绑定应该做的。旧绑定允许 strings 因为它使用 Reflection 在 运行-time. 期间为您解析类型
原来我的显式类型理论是错误的(感谢@igrali 指出)。 Source
确实需要 string
,只要它不是 null
或 ''
。所以它给我们留下了两个选择来解决这个问题。
选项 1
将您的 uri
保持为 string
,但检查您的 vm
,一旦它是 null
或 ''
,return 一些虚拟文本(甚至 return 写一个字母 x
也行!)。
选项 2
将 uri
从 string 更改为 BitmapImage。然后你可以使用 TargetNullValue
和 FallbackValue
来处理空值和无效绑定。
... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"
在 XAML 我有以下行:
<Image x:Name="MainImage"
Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}"
Stretch="UniformToFill"/>
在视图模型中:
public string MainPic
{
get
{
if (Data == null)
return default(string);
else
return Data.Photos.ElementAtOrDefault(0).url;
}
}
应用程序编译正常,但在执行期间(因为数据在几秒后填充),应用程序崩溃并出现以下异常:
System.ArgumentException: The parameter is incorrect.
调试器中断于:
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"
或 space" "
都可以。 - 如果绑定到
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
,Image
的 Source
需要绑定到完全相同类型的 属性 ImageSource
(例如 BitmapImage
)而不是 string
,否则它会抛出一个编译时错误,这正是编译时绑定应该做的。旧绑定允许 strings 因为它使用 Reflection 在 运行-time.
原来我的显式类型理论是错误的(感谢@igrali 指出)。 Source
确实需要 string
,只要它不是 null
或 ''
。所以它给我们留下了两个选择来解决这个问题。
选项 1
将您的 uri
保持为 string
,但检查您的 vm
,一旦它是 null
或 ''
,return 一些虚拟文本(甚至 return 写一个字母 x
也行!)。
选项 2
将 uri
从 string 更改为 BitmapImage。然后你可以使用 TargetNullValue
和 FallbackValue
来处理空值和无效绑定。
... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"