Если изображение не найдено, пропустить запись в ListView Xamarin Forms

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

У меня есть динамически созданный 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, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
  

Я извлекаю эти изображения из папки в моей библиотеке PCL. Не совсем уверен, как это сделать.

РЕДАКТИРОВАТЬ: РЕШАЕМАЯ, если у кого-то есть эта проблема, я нашел рабочее решение. Лукас Чжан помог мне прийти к этому решению, но я изменил его, чтобы оно работало на меня. По сути, я создал совершенно новый valueconverter и привязал true или false к атрибуту isVisible для stacklayout. Однако, поскольку я передаю ImageID, который является идентификатором записи, я просто использую RecordID в качестве ImageID, и именно так называются мои изображения .. (например, image_ID.png, поэтому Image_1.png) 0 не существует, как предполагалось в ответе Лукаса. Раньше я Assembly.GetExecutingAssembly().GetManifestResourceStream(myPathtoImage); помещал это в переменную, а затем проверял, равна ли переменная нулю. Если это так, я возвращаю false.else возвращает true и отображает элемент в listview.

Комментарии:

1. вам необходимо предварительно обработать ваши данные и удалить все элементы, у которых отсутствует изображение

Ответ №1:

Вы могли бы привязать 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>
  

в конвертере

 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, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

  

Комментарии:

1. блестяще. Я думал об использовании isVisible, но забыл, что могу привязать его к IValueConverter.