Xamarin Forms Listview - использование настраиваемой ячейки представления для каждого элемента в источнике элементов

Я не уверен, возможно ли это и есть ли какие-либо рекомендуемые способы для этого. По сути, я пытаюсь получить представление списка с «зубчатыми» или разными ячейками представления для каждой ячейки в представлении списка. В качестве очень простого примера я пытаюсь динамически отображать кнопку, метку и запись в каждой отдельной строке списка. Вот мой код:

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="Chaser.Views.Admin_Detail_MasterDetail_View">
    <ContentPage.Content>
        <StackLayout Orientation="Vertical"
                     Spacing="15"
                     Margin="10">
            <Label Text="{Binding ViewTitle, Mode=OneWay}"
                   FontSize="Large"
                   TextColor="Red"
                   FontAttributes="Bold" />
            <ListView ItemsSource="{Binding ItemViews, Mode=OneWay}"
                      SelectionMode="None"
                      PropertyChanged="ListView_PropertyChanged">
            </ListView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Код позади

public Admin_Detail_MasterDetail_View()
    {
        InitializeComponent();
        DetailViewContext = new Models.Detail_MasterDetail_Model();
        DetailViewContext.ViewTitle = "Info";

        DetailViewContext.ItemViews = new List<ViewCell>
        {
            new ViewCell
            {
                View = new Button
                {
                    Text = "TestButton"
                },
            },

            new ViewCell
            {
                View = new Label
                {
                    Text = "TestLabel"
                }
            },

            new ViewCell
            {
                View = new Entry
                {
                    Placeholder = "TestEntry"
                }
            }
        };

        BindingContext = DetailViewContext;
    }

Примечание. Это также было предпринято с добавлением макетов стека к представлениям, а затем добавлением отдельных элементов в макеты стека, в любом случае я получаю следующее:

введите описание изображения здесь

Если возможно, я хотел бы иметь привязки команд для каждого вида ячейки, поскольку один тип ячейки может иметь разные действия в контекстном меню, чем другой.

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

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

Спасибо за любой вклад по этому поводу!


person Schwagmister    schedule 01.09.2019    source источник
comment
Вы привязываете ListView к источнику данных и позволяете ему создавать пользовательский интерфейс на основе шаблона. Вы не привязываете его к списку элементов пользовательского интерфейса. Если все ячейки разные или в основном разные, то использование ListView может быть неправильным подходом, а не простым созданием пользовательского интерфейса вручную.   -  person Jason    schedule 01.09.2019
comment
Для некоторых элементов одного и того же пользовательского интерфейса вы можете проверить DataTemplateSelector: docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/   -  person Jessie Zhang -MSFT    schedule 02.09.2019
comment
Если вы используете настраиваемую ячейку просмотра для каждого элемента, Listview не подходит.   -  person Jessie Zhang -MSFT    schedule 02.09.2019


Ответы (2)


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

После этого Microsoft doc, настроить его было довольно просто. Это также позволяет мне иметь настраиваемые действия контекста ячейки просмотра, определенные для каждого типа ячейки просмотра.

person Schwagmister    schedule 03.09.2019

После стольких исследований я создал код Listview с тестовыми данными.

просто скопируйте и вставьте код и проверьте результат.

        <ListView HasUnevenRows="true"
                  RowHeight="200">
            <ListView.ItemsSource>
                <x:Array Type="{x:Type x:String}">
                    <x:String>Item One</x:String>
                    <x:String>Item Two</x:String>
                    <x:String>Item Three</x:String>
                    <x:String>Item Four</x:String>
                    <x:String>Item Five</x:String>
                </x:Array>
            </ListView.ItemsSource>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Frame BorderColor="Red" Padding="0">
                            <Grid Margin="10">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="90" />
                                    <RowDefinition Height="90"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <BoxView Grid.Row="0"
                                         Grid.Column="0"
                                         Color="Yellow" />
                                <BoxView Grid.Row="0"
                                         Grid.Column="1"
                                         Color="Black" />
                                <BoxView Grid.Row="1"
                                         Grid.Column="0"
                                         Color="Green" />
                                <BoxView Grid.Row="1"
                                         Grid.Column="1"
                                         Color="Blue" />
                                <Label Text="{Binding}"
                                       FontAttributes="Bold"
                                       TextColor="Red"
                                       HorizontalOptions="CenterAndExpand"
                                       VerticalOptions="CenterAndExpand"/>
                            </Grid>
                        </Frame>
                </ViewCell>
              </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
person Venkat Ch    schedule 02.06.2020