Я пытаюсь написать CustomRenderer, который может позволить ListView иметь переменные цвета строк. Я столкнулся с проблемами и не уверен, может ли это быть ошибкой или я просто не выполняю рендеринг правильно:Чередование строк в Xamarin Forms ListView IOS
Мои ожидания в отношении следующего кода заключаются в том, что каждая пользовательская ячейка зрения должна получать цвет на основе его позиции , Однако это не то, что происходит, я считаю, что этот код 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-форм-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>
Edit:
Итак, я решил вопрос с получением индекс с помощью var index = tv.IndexPathForRowAtPoint(cell.Center).Row;
, однако это вызвало еще один вопрос. Он работает отлично в первый раз, а также возвращается на страницу из подвид. Однако, когда я покидаю страницу и перехожу к другому виду из masterpage
и возвращаюсь, он устанавливает фон всех элементов серым. В настоящее время я создаю новую страницу, а затем устанавливаю ее на masterpage.details
, когда вы выходите из меню.