Я пытаюсь написать CustomRenderer, который может позволить ListView иметь чередующиеся цвета строк. У меня возникла проблема, и я не уверен, может ли это быть ошибка, или я просто неправильно реализую средство визуализации:
Я ожидаю от следующего кода, что каждая пользовательская ячейка представления должна иметь цвет в зависимости от ее положения. Однако это не то, что происходит, я считаю, что этот код tv.IndexPathForCell(cell).Row
должен возвращать индекс ячейки, но он работает не так, как ожидалось. В настоящее время он возвращает нулевое значение (которое должно быть, если ячейка не является частью представления), но я считаю, что ячейка является частью представления таблицы и, следовательно, моей проблемой. Если я закомментирую var index = tv.IndexPathForCell(cell).Row;
, а затем установлю для цвета фона статическое значение, код и представление будут работать правильно. Кроме того, генерируется исключение из-за нулевого значения, и для ячейки устанавливается базовое значение, а представление визуализируется с фоном по умолчанию.
Я что-то делаю не так, я пробовал несколько других вещей, но считаю, что это должен быть правильный способ сделать это.
код c #:
[assembly: ExportRenderer(typeof(CustomViewCell), typeof(CustomViewCellRenderer))]
namespace AIM.iOS {
class CustomViewCellRenderer : ViewCellRenderer {
public override UITableViewCell GetCell(Cell item, UITableView tv) {
UITableViewCell cell;
try {
cell = base.GetCell(item, tv);
var customCell = (CustomViewCell)item;
var cell = base.GetCell(item, tv);
var index = tv.IndexPathForCell(cell).Row;
cell.BackgroundColor = (index % 2 == 0) ? Color.Gray.ToUIColor() :
Color.White.ToUIColor();
}catch (Exception ex){
string message = ex.Message;
cell = base.GetCell(item, tv);
}
return cell
}
}
}
Я расширяю класс ExtendedViewCell из Xamarin-Forms-Labs, который добавляет свойства фона к объекту ViewCell.
namespace AIMUI.Controls {
public class CustomViewCell : ExtendedViewCell {
public CustomViewCell() { }
}
}
Вот Xaml:
<localcontrols:ListView>
<ListView.ItemTemplate>
<DataTemplate>
<localcontrols:CustomViewCell>
<localcontrols:CustomViewCell.View>
</localcontrols:CustomViewCell.View>
</localcontrols:CustomViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</localcontrols:ListView>
Изменить:
Хорошо, поэтому я решил проблему с получением индекса с помощью var index = tv.IndexPathForRowAtPoint(cell.Center).Row;
, однако это вызвало другую проблему. Он отлично работает в первый раз, а также при возврате на страницу из дополнительного представления. Однако, когда я покидаю страницу, перехожу к другому виду из masterpage
и возвращаюсь, он устанавливает фон всех элементов серым. В настоящее время я создаю новую страницу и затем устанавливаю для нее значение masterpage.details
, когда захожу из меню.