Извините за неточность названия, но я не мог описать мою проблему лучше. Если у кого-то есть более точное и точное название, я хотел бы знать. Спасибо.
В приложении я использую 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 в списке , список, похоже, теряет способ отображения кнопки и показывает неправильный цвет, даже после обновления еще пару раз он не работает.