У меня проблемы с просмотром списка XF и пользовательским рендерером. Мне нужно:
- Изменить цвет фона выбранного элемента
- Предварительно выбрать элемент при запуске программным способом.
Я смог изменитьцвет фона выбранного элемента, и все работает, если я предварительно не выбрал элемент.
Для пользовательских элементов управления и средств визуализации я использовал «стандартный» код, который можно найти во многих примерах:
Пользовательский элемент управления:
public class RRViewCell : ViewCell
{
public static readonly BindableProperty SelectedItemBackgroundColorProperty = BindableProperty.Create("SelectedItemBackgroundColor", typeof(Color), typeof(RRViewCell), Color.Default);
public Color SelectedItemBackgroundColor
{
get { return (Color)GetValue(SelectedItemBackgroundColorProperty); }
set { SetValue(SelectedItemBackgroundColorProperty, value); }
}
}
Средство визуализации Android:
public class RRViewCellRendererAndroid : ViewCellRenderer
{
private Android.Views.View _cellCore;
private Drawable _unselectedBackground;
private bool _selected;
protected override Android.Views.View GetCellCore(Cell item, Android.Views.View convertView, ViewGroup parent, Context context)
{
_cellCore = base.GetCellCore(item, convertView, parent, context);
_selected = false;
_unselectedBackground = _cellCore.Background;
return _cellCore;
}
protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
{
base.OnCellPropertyChanged(sender, args);
if (args.PropertyName == "IsSelected")
{
_selected = !_selected;
if (_selected)
{
var extendedViewCell = sender as RRViewCell;
_cellCore.SetBackgroundColor(extendedViewCell.SelectedItemBackgroundColor.ToAndroid());
}
else
{
_cellCore.SetBackground(_unselectedBackground);
}
}
}
}
XAML:
<ctrl:RRViewCell SelectedItemBackgroundColor="{StaticResource NavigationPrimary}">
(NavigationPrimary настроен на оттенок синего).
Как я уже сказал, все работает, если никакие элементы не выбираются программно, но если я делаю:
MyList.SelectedItem = loc[0];
, это результат:
(разумные данные замаскированы!)
В этом случае вместо пользовательского используется цвет фона по умолчанию.
Более того, если я коснусь другого элемента, это произойдет:
Обратите внимание:
- ЕслиЯ повторилy коснитесь разных элементов (кроме первого):
- Первый элемент остается синим
- Последний нажатый элемент имеет синий цвет, предыдущий - белый, так что я всегдау первого элемента и последнего постучанного синего цвета.
- Если я коснусь первого элемента, он станет оранжевым и останется оранжевым при последующих нажатиях.
- Нажатие другого элемента послеЯ нажал на первый превращает первый элемент из оранжевого в синий.