Как переключить видимость дочерних элементов в индексе представления списка?

#c# #xamarin #xamarin.forms #uwp

Вопрос:

Я создаю приложение UWP с помощью Xamarin.Формы. Следующий код представляет собой фрагмент кода XAML. Эта страница содержит представление списка, в котором отображаются проанализированные данные JSON.

 <ListView x:Name="listView"
                  ItemTapped="ItemTapped"
                  Style="{StaticResource openpageListView}">
            <ListView.ItemTemplate>
                <DataTemplate>
                        <ViewCell>
                            <Frame Padding="0, 40, 0, 40">

                                <StackLayout HorizontalOptions="CenterAndExpand"
                                             VerticalOptions="StartAndExpand">
                                    <StackLayout Orientation="Horizontal"
                                                 HeightRequest="30"
                                                 WidthRequest="750"
                                                 HorizontalOptions="CenterAndExpand"
                                                 VerticalOptions="Start">
                                        <Label Text="Topic: "
                                               TextColor="White"
                                               FontAttributes="Bold"
                                               HorizontalOptions="StartAndExpand"/>
                                        <Label Text="{Binding Topic}"
                                               HorizontalOptions="StartAndExpand"/>
                                        <Label Text="Input Type / Output Type: "
                                               TextColor="White"
                                               FontAttributes="Bold"
                                               HorizontalOptions="EndAndExpand" />
                                        <Label HorizontalOptions="EndAndExpand">
                                            <Label.Text>
                                                <MultiBinding StringFormat="{}{0} => {1}">
                                                    <Binding Path="InputType" />
                                                    <Binding Path="OutputType" />
                                                </MultiBinding>
                                            </Label.Text>
                                        </Label>
                                    </StackLayout>

                                    <!-- Boolean specific subsection -->
                                    <Grid x:Name="boolean"
                                          IsVisible="false"
                                          Padding="0, 15, 0, 15"
                                          RowSpacing="15"
                                          ColumnSpacing="15"
                                          HorizontalOptions="CenterAndExpand">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="30"/>
                                        </Grid.RowDefinitions>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="205" />
                                            <ColumnDefinition Width="205" />
                                            <ColumnDefinition Width="205" />
                                        </Grid.ColumnDefinitions>
                                        <StackLayout Orientation="Horizontal" Grid.Column="0" Grid.Row="0">
                                            <Label Text="Default: "
                                               TextColor="White"
                                               FontAttributes="Bold"/>
                                            <Label Text="{Binding Default}" />
                                        </StackLayout>
                                        <StackLayout Orientation="Horizontal" Grid.Column="1" Grid.Row="0">
                                            <Label Text="Invert: "
                                               TextColor="White"
                                               FontAttributes="Bold" />
                                            <Label Text="{Binding Invert}" />
                                        </StackLayout>
                                        <StackLayout Orientation="Horizontal" Grid.Column="2" Grid.Row="0">
                                            <Label Text="Button / Axis ID: "
                                               TextColor="White"
                                               FontAttributes="Bold" />
                                            <Label Text="{Binding ButtonId}" />
                                        </StackLayout>
                                    </Grid>
                                    
                                    <!-- Analog Specific Subsection -->
                                    <StackLayout x:Name="analog"
                                                 WidthRequest="750"
                                                 IsVisible="true">
                                        <Grid Padding="0, 15, 0, 15"
                                              RowSpacing="15"
                                              ColumnSpacing="50"
                                              HorizontalOptions="CenterAndExpand">
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="30"/>
                                            </Grid.RowDefinitions>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="250" />
                                                <ColumnDefinition Width="250" />
                                            </Grid.ColumnDefinitions>
                                            <StackLayout Orientation="Horizontal" Grid.Row="0" Grid.Column="0">
                                                <Label Text="Button / Axis ID: "
                                                       TextColor="White"
                                                       FontAttributes="Bold" />
                                                <Label Text="{Binding AxisId}" />
                                            </StackLayout>
                                            <StackLayout Orientation="Horizontal" Grid.Row="0" Grid.Column="1">
                                                <Label Text="Clamp: "
                                                       TextColor="White"
                                                       FontAttributes="Bold" />
                                                <Label Text="{Binding Clamp}" />
                                            </StackLayout>
                                        </Grid>
                                        <Grid Padding="0, 0, 0, 15"
                                              RowSpacing="15"
                                              ColumnSpacing="50"
                                              HorizontalOptions="CenterAndExpand">
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="30"/>
                                            </Grid.RowDefinitions>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="205" />
                                                <ColumnDefinition Width="205" />
                                                <ColumnDefinition Width="205" />
                                            </Grid.ColumnDefinitions>
                                            <StackLayout Orientation="Horizontal" Grid.Row="0" Grid.Column="0">
                                                <Label Text="Default: "
                                                       TextColor="White"
                                                       FontAttributes="Bold" />
                                                <Label Text="{Binding Default}" />
                                            </StackLayout>
                                            <StackLayout Orientation="Horizontal" Grid.Row="0" Grid.Column="1">
                                                <Label Text="Scalar: "
                                                       TextColor="White"
                                                       FontAttributes="Bold" />
                                                <Label Text="{Binding Scalar}" />
                                            </StackLayout>
                                            <StackLayout Orientation="Horizontal" Grid.Row="0" Grid.Column="2">
                                                <Label Text="Bias: "
                                                       TextColor="White"
                                                       FontAttributes="Bold" />
                                                <Label Text="{Binding Bias}" />
                                            </StackLayout>
                                        </Grid>
                                    </StackLayout>
 

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

Вот как выглядит подраздел «логическое значение».

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

Вот как выглядит подраздел «аналог».

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

Ответ №1:

Да, есть. Но я не думаю, что это хорошая идея. Вместо этого вы можете разделить свой ListView.DataTemplate на два отдельных файла и использовать DataTemplateSelector

Смотрите эти ссылки для получения более подробной информации:

Создание Xamarin.Форма DataTemplate

Создание Xamarin.Формирует DataTemplateSelector