Элементы условного форматирования в сетке внутри ListView в Xamarin.Forms - PullRequest
0 голосов
/ 30 марта 2020

Я очень новичок в Xamarin.Forms и разрабатываю свое первое приложение (для Android и IoS).

У меня есть набор информации для отображения в Grid Layout внутри a ListView (источник данных установлен в коде позади).

Я должен изменить цвет фреймов и текст относительных меток, основываясь на некоторых значениях, которые есть в исходных данных.

Вот рабочий код (с использованием заполнителей в качестве цвета рамки и текста метки):

XAML:

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>

                            <Grid x:Name="GridLayout" Padding="20">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="Auto" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>

                                <Label Text="{Binding Name}" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" FontSize="18" TextColor="Black" FontAttributes="Bold" />
                                <Label Text="{Binding LessonDate}" Grid.Row="1" Grid.Column="0"  FontSize="14" TextColor="Gray"  />
                                <Label Text="{Binding StartEndTime}" Grid.Row="1" Grid.Column="1"  FontSize="14" TextColor="Gray"  Margin="-30,0,0,0"/>
                                <Frame Grid.Row="2" Grid.Column="0"
                                                    CornerRadius="15"
                                                    Padding="0"
                                                    BackgroundColor="Silver"
                                                    Margin="0,10,0,10" 
                                                    HasShadow="False" 
                                                    WidthRequest="125"
                                                     x:Name="UserStatusFrame">
                                    <Label Text="Placeholder" Margin="5" HorizontalOptions="Center" BackgroundColor="Transparent" 
                                                                             TextColor="Gray" x:Name="UserStatusLabel"/>
                                </Frame>
                                <Frame Grid.Row="2" Grid.Column="1"
                                                    CornerRadius="15"
                                                    Padding="0"
                                                    BackgroundColor="Yellow"
                                                    Margin="0,10,0,10" 
                                                    HasShadow="False" 
                                                    WidthRequest="125"
                                                    x:Name="CourseStatusFrame">
                                    <Label Text="Placeholder" Margin="5" HorizontalOptions="Center" BackgroundColor="Transparent" 
                                                                             TextColor="Black" x:Name="CourseStatusLabel" />
                                </Frame>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView> 

Код сзади:

protected override void OnAppearing()
        {
            base.OnAppearing();

            FillUncompletedLessonsList(); // fills the list from a rest WS using a simple model class

            LessonsListview.ItemsSource = UncompletedLessonsList;

            SetListViewFormat();
        }

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

Например, что-то вроде:

foreach item in the list {
  if UncompletedLessonsList.completed == true {
    UserStatusLabel.Text = "Completed"
    UserStatusFrame.BackgroundColor = "Green"
  }
}

Но я не могу понять, каким образом я могу динамически получить доступ к этим настройкам ..

Заранее спасибо за помощь!

Редактировать 1 - Модель данных:

UncompletedLessonsList - список уроков

 public class Lesson
    {
        public string Name { get; set; }

        public string Description { get; set; }

        public string LessonDate { get; set; }

        public string StartEndTime { get; set; }

        public string Location { get; set; }

        public string State { get; set; }

        public bool Completed { get; set; }

        public RestWSTeacher Teacher { get; set; }

        public List<Activity> Activities { get; set; }
    }

1 Ответ

0 голосов
/ 31 марта 2020

Вам необходимо использовать Преобразователи значений , чтобы преобразовать значение из значения bool:

public class myValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

        if ((bool)value == true)
        {
            return "Completed";
        }

        return "unCompleted";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((bool)value == true)
        {
            return "Completed";
        }

        return "unCompleted";
    }
}

Затем в xaml, привязав ваши данные следующим образом:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:myValueConverter x:Key="myCellValueConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

<StackLayout>
    <Button Text="changeStatus" Clicked="Button_Clicked"/>

    <ListView x:Name="myListView">

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>

                    <Grid x:Name="GridLayout" Padding="20">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>

                        <Label Text="{Binding isComplete, Converter={StaticResource myCellValueConverter}}" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" FontSize="18" TextColor="Black" FontAttributes="Bold" />

                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

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

...