所以,我有ListView
x:Bind
列表和DataTemplate
。
DataTemplate
的{{1}}填充了Elipse
。
一切正常,但是:
如果列表中的项目的字符串URL图像属性具有ImageBrush
值,则应用程序崩溃。
我尝试设置Null
,但我的问题是模板的TargetNullValue
是来自API的类,所以我无法控制它。我希望将图像作为默认值,以防项目的图像值为null。
换句话说,如果商品的图片网址属性为X:DataType
,我希望Null
从我的XAML
文件夹中加载预定义图片。
问题在于,因为我已将Assets
设置为类,所以DataType
必须包含在该类中。
x:Bind
以上例如<Ellipse Width="40" Height="40">
<Ellipse.Fill>
<ImageBrush ImageSource="{x:Bind IconUrl, Mode=OneWay,TargetNullValue=/Assets/NoAvatarIcon.png}"/>
</Ellipse.Fill>
</Ellipse>
中的Null
字符串无效,因为ImageSource
设置为Path
。
右?任何解决方法?
答案 0 :(得分:2)
Binding中的FallbackValue和x:Bind是不同的。
在Binding中,FallbackValue是绑定无法返回值时使用的值。
绑定使用FallbackValue来处理Path根本不对数据源进行求值的情况,或者如果尝试使用双向绑定在源上设置它会抛出数据绑定引擎捕获的异常。如果源值是依赖属性sentinel值
DependencyProperty.UnsetValue
,也会使用FallbackValue。
但是在x:Bind中,FallbackValue指定了在无法解析源或路径时显示的值。它无法与DependencyProperty.UnsetValue一起使用。
对于您的方案,您可以使用Converter操作DependencyProperty.UnsetValue
,就像下面的代码一样。
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
object res;
res = (value == null ? false : true) ? string.IsNullOrEmpty(value.ToString()) ? null : new BitmapImage(new Uri(value.ToString())) : null;
return res;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
Xaml文件中的用法
<Page.Resources>
<local:ImageConverter x:Key="cm" />
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView x:Name="MyListView" ItemsSource="{x:Bind Items}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:HeadPhoto">
<Ellipse Width="40" Height="40">
<Ellipse.Fill>
<ImageBrush ImageSource="{x:Bind PicUri,TargetNullValue=/Assets/pic.png,Converter={StaticResource cm }}" />
</Ellipse.Fill>
</Ellipse>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Page>
占位符图片效果。