#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.