0

所以,我有ListView一个x:Bind列表和一个DataTemplate.

DataTemplate一个Elipse充满一个ImageBrush

一切正常,但是:

如果列表中的项目具有Null其字符串 URL 图像属性的值,则应用程序崩溃。

我尝试设置 aTargetNullValue但我的问题是X:DataType模板是来自 API 的类,所以我无法控制它。我希望将图像作为默认值,以防项目的图像值为 null。

换句话说,如果项目的图像 URL 属性是Null,我想XAML从我的Assets文件夹中加载预定义的图像。

问题是,因为我已将 my 设置DataType为班级,所以我要做的任何事情x:Bind都必须在该班级内。

<Ellipse Width="40" Height="40">
    <Ellipse.Fill>
        <ImageBrush ImageSource="{x:Bind IconUrl, Mode=OneWay,TargetNullValue=/Assets/NoAvatarIcon.png}"/>
    </Ellipse.Fill>
</Ellipse>

上面的示例不适用于 in 中的Null字符串,ImageSource因为Path设置为Class.

正确的?任何解决方法?

4

1 回答 1

2

Binding 和 x:Bind 中的FallbackValue不同。

在 Binding 中,FallbackValue 是绑定无法返回值时使用的值。

对于 Path 根本不在数据源上评估的情况,或者如果尝试使用双向绑定在源上设置它会引发数据绑定引擎捕获的异常,则绑定使用 FallbackValue。如果源值是依赖属性标记值,则也使用 FallbackValue DependencyProperty.UnsetValue

但是在 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>

占位符图像效果。

在此处输入图像描述

于 2017-02-28T09:39:19.587 回答