Загрузка ListView со списком объектов, содержащих атрибуты, не устанавливает BackgroundColor, как следует - PullRequest
0 голосов
/ 29 мая 2019

Извините за неточность названия, но я не мог описать мою проблему лучше. Если у кого-то есть более точное и точное название, я хотел бы знать. Спасибо.

В приложении я использую Xamarin.Forms с Prism, есть определенная страница, содержащая ListView, чьи элементы имеют некоторые данные и кнопку. Я загружаю из API ObservableCollection из MyObject, где у меня есть некоторые свойства, определяющие метки и стили элементов моего списка. Этот список обновляется каждый раз, когда я обновляю его или нажимаю на одну из кнопок элемента. При нажатии кнопки вызывается API, который обновляет некоторые свойства, включая цвет фона кнопки элемента.

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

Мой ObservableCollection<MyObject> является заявкой на ListView в ItemsSource, а мой атрибут Button BackgroundColor установлен {Binding ButtonColor} Я пытался унаследовать MyObject от INotifyPropertyChanged, и это ничего не изменило. Я уже несколько раз проверял, правильно ли задан цвет в коде, и так было всегда.

MyObject:

      public class MyObject
      {
            public int Id { get; set; }
            public string Value { get; set; }
            public string Status { get; set; }  
            public string BackgroundColor { get; set; }
            public string ButtonColor { get; set; }  
            public string ButtonText { get; set; }
       }

Мой ListView:

      <ListView 
            VerticalOptions="FillAndExpand"
            ItemsSource="{Binding MyObjectList}"
            IsPullToRefreshEnabled="True"
            RefreshCommand="{Binding RefreshListCommand}"
            IsRefreshing="{Binding IsLoading}" 
            HasUnevenRows="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell >
                        <Grid 
                            RowSpacing="0"
                            BackgroundColor="{Binding BackgroundColor}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="3" />
                                <RowDefinition Height="20" />
                                <RowDefinition Height="3" />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="1.3*" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <Label 
                                Text="{Binding Value"
                                Grid.Row="2" Grid.Column="0"/>
                            <Button
                                Grid.Row="2" Grid.Column="1"
                                Text="{Binding ButtonText}"
                                BackgroundColor="{Binding ButtonColor}"
                                Clicked="Update_Clicked"/>
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Мои команды (Update_Clicked выполняет UpdateCommand, передавая идентификатор выбранного элемента)

      private ObservableCollection<MyObject> _myObjectList;
      public ObservableCollection<MyObject> MyObjectList
      {
          get => _myObjectList;
          set => SetProperty(ref _myObjectList, value);
      }

        private DelegateCommand _refreshListCommand;
        public DelegateCommand RefreshListCommand=>
            _refreshListCommand?? (_refreshListCommand= new DelegateCommand(ExecuteRefreshListCommand));

      private async void ExecuteRefreshListCommand()
      {
           MyObjectList?.Clear();
           var serviceReturn = await _myService.GetObjectList();//Returns a ordered by Status (Stopped, ToBegin, Started) List of MyObject with properties depending on its status (they all are born with the ToBegin Status
           MyObjectList =  new ObservableCollection<MyObject>(serviceReturn )
      }

        private DelegateCommand<int?> _updateCommand;
        public DelegateCommand<int?> UpdateCommand=>
            _updateCommand?? (_updateCommand= new DelegateCommand<int?>(ExecuteUpdateCommand));

      private async void ExecuteUpdateCommand(int? id)
      {
           await _myService.UpdateToNextStatus(id); //Changes the object's status and its properties to the next in a cicle ToBegin -> Started -> Stopped -> Started -> ...
           ExecuteRefreshListCommand()
      }

MyObject имеет 3 возможных состояния в соответствии со своим статусом:

Status = "ToBegin"
BackgroundColor = "#fff"
ButtonColor = "#00ff00"
ButtonText = "Start"

Status = "Started"
BackgroundColor = "#aaa"
ButtonColor = "#ff0000"
ButtonText = "Stop"

Status = "Stopped"
BackgroundColor = "#fff"
ButtonColor = "#ff0000"
ButtonText = "Restart"

Дело в том, что все обновляется красиво, цвет фона сетки, текст кнопки ... но в конечном итоге после нескольких раундов изменения статуса с Запущено на Остановлено и Остановлено на Запущено с ToBegin в списке , список, похоже, теряет способ отображения кнопки и показывает неправильный цвет, даже после обновления еще пару раз он не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...