如果未找到图像,请跳过ListView Xamarin表单中的记录 在Converter

问题描述

我有一个动态创建的ListView。我想如果找不到图像,则跳过该行。我不确定这是否可行,但我只想显示带有图像的项目。

         <ListView.ItemTemplate>
            <DataTemplate>
                 <ViewCell>
                    <StackLayout x:Name="{Binding Name}" 
                                 Orientation="Horizontal"
                                 Padding="5">
                        <Image x:Name="categoryImage" Source="{Binding ImageID,Converter={StaticResource converter}}" 
                               Aspect="AspectFit" 
                               WidthRequest="130"/>
                        <Label x:Name="categoryLabel" Text="{Binding Description}"/>
                   </StackLayout> 
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

值转换器

 public class ImagePostValueConverter : IValueConverter
    {
        public int source { get; set; }

        public object Convert(object value,Type targettype,object parameter,CultureInfo culture)
        {
            var source = (int)value;
            if (source == 0)
                return null;
            var imageSource = ImageSource.Fromresource($"ERPProject.AllImages.MyImages.ea_{source }.png",typeof(ImagePostValueConverter).GetTypeInfo().Assembly);
            return imageSource;

        }

        public object ConvertBack(object value,CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

我正在从PCL库中的文件夹中提取这些图像。不太确定如何做到这一点。

编辑:已解决 如果有人遇到这个问题,我想出了一个可行的解决方案。 Lucas Zhang帮助我提出了这个解决方案,但我对其进行了调整以使其对我有效。 从本质上讲,我确实创建了一个全新的valueconverter,并将true或false绑定到StackLayout的IsVisible属性。但是,正弦的,我传入的是记录ID的ImageID,我只是将recordID用作ImageID,这也是我的图像命名的方式。(例如image_ID.png,因此Image_1.png)0不存在就像卢卡斯的答案中假设的那样。我使用了Assembly.GetExecutingAssembly().GetManifestResourceStream(myPathtoImage); 将其放在变量中,然后查看变量是否为null。如果是,则返回false。否则返回true,并在列表视图中显示该项目。

解决方法

您可以绑定 IsVisible

<StackLayout x:Name="{Binding Name}" 
             Orientation="Horizontal"
             Padding="5"
             IsVisible="Binding ImageID,Converter={StaticResource IsVisibleConverter}}"
             >
                        <Image x:Name="categoryImage" Source="{Binding ImageID,Converter={StaticResource converter}}" 
                               Aspect="AspectFit" 
                               WidthRequest="130"/>
                        <Label x:Name="categoryLabel" Text="{Binding Description}"/>
</StackLayout>

在Converter

public class IsVisibleConverter: IValueConverter
    {
        public int source { get; set; }

        public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
        {
            var source = (int)value;
            if (source == 0)
                return false;
            else
                return true;

        }

        public object ConvertBack(object value,CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }