Значение Xamarin Forms Set указано c в CollectionView - PullRequest
1 голос
/ 31 января 2020

У меня проблема. Я создал CollectionView с содержимым списка с изображениями. Класс myImage выглядит следующим образом:

public class myImage
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Type { get; set; }
    [XmlIgnore]
    public ImageSource imageSource { get; set; }
}

Теперь в CollectionView у меня также есть средство выбора со списком с размерами. Этот класс выглядит следующим образом:

public class Format
{
    public int Id { get; set; }
    public string Size{ get; set; }
    public float Price { get; set; }
    public string Type { get; set; }
}

Я хочу, чтобы при myImage.Type было указано значение c, например «type1», что единственным параметром в средстве выбора будет Размер. где Format.Type="type1". В остальном весь список может отображаться в средстве выбора, за исключением формата, в котором Format.Type = "type1".

Итак, я хочу CollectionView с изображениями, рядом с изображением есть средство выбора. Если myImage.Type = "type1", средство выбора будет заполнено форматами, где Type = "type1". Остальная часть изображения получает форматы, где Format.Type = "Normal".

Вот мой xaml:

<DataTemplate>
    <Grid HeightRequest="100" VerticalOptions="Center">
        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition Height="40"/>
            <RowDefinition Height="10"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="3"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="3"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="3"/>
        </Grid.ColumnDefinitions>

        <ff:CachedImage  Grid.Row="0" Grid.RowSpan="2" Grid.Column="1" Aspect="AspectFill" Source="{Binding imageSource}" />

        <Picker Grid.Row="0" Grid.RowSpan="2" Grid.Column="3" Title="Formaat" HorizontalOptions="FillAndExpand"
                ItemsSource="{Binding Source={RelativeSource AncestorType={x:Type vm:VM_FotoLijst}}, Path=formaatList}"
                ItemDisplayBinding="{Binding Size}" PropertyChanged="FormaatPicker_PropertyChanged"/>
    </Grid>
</DataTemplate>

Как я могу это сделать?

1 Ответ

0 голосов
/ 01 февраля 2020

Я бы использовал два разных шаблона элемента в зависимости от значения вашего типа. В каждом из этих шаблонов вы можете указать источник предметов вашего выбора на отдельный источник.

Пользовательский DataTemplateSelector позволит вам переключать DataTemplate элемента на основе свойств элемента. Следующий пользовательский код DataTemplateSelector должен работать для вашего варианта использования. Я также добавил несколько XAML, описывающих, как вы можете определить два шаблона данных, между которыми вы хотите переключаться. В самом конце приведен пример того, как установить этот селектор шаблона данных в вашем CollectionView.

Код

public class ImageTemplateSelector : DataTemplateSelector
{
    public DataTemplate NormalTemplate { get; set; }
    public DataTemplate SpecialTemplate { get; set; }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        if (item is null) return NormalTemplate;

        if (item is myImage image)
        {
            if (image.Type == "type1")
                return SpecialTemplate;
            else
                return NormalTemplate;
        }
        else
            throw new ArgumentException(nameof(ImageTemplateSelector));
    }
}

XAML

<ResourceDictionary>
    <DataTemplate x:Key="normalImageTemplate">
        <!--all the image related controls-->
        <Picker ItemsSource="{Binding NormalPickerSource}"/>
    </DataTemplate>

    <DataTemplate x:Key="specialImageTemplate">
        <!--all the image related controls-->
        <Picker ItemsSource="{Binding SpecialPickerSource}"/>
    </DataTemplate>

    <local:ImageTemplateSelector x:Key="imageTemplateSelector"
        NormalTemplate="{StaticResource normalImageTemplate}"
        SpecialTemplate="{StaticResource specialImageTemplate}" />
</ResourceDictionary>

<CollectionView ItemSource="{Binding YourItems}"
                ItemTemplate="{StaticResource imageTemplateSelector}">
</CollectionView>
...