У меня есть просмотр списка, который отображает некоторую информацию об истории платежей пользователей, и в каждой записи платежа есть различные элементы, которые отображаются или не отображаются в зависимости от объекта PaymentEntry. Переменные в этом объекте заполняются из вызова API, который возвращает Json, а затем десериализует его в список наблюдаемых типа PaymentEntry.
Элементы в ячейках списка могут отличаться в зависимости от двух значений bools в записях по отдельности. Таким образом, можно отобразить макет стека, который содержит две метки, а другой элемент может не отображать это. У меня есть переменная IsEnabled этих элементов, привязанных к логическим переменным в списке записей, так как я ожидаю, что просмотр списка сможет динамически отображать ячейки просмотра независимо от того, отключены некоторые из меток внутри ячейки или нет.
Мой метод кэширования - RetainElement из-за переменной природы ячеек.
Теперь проблема в том, что привязка для IsEnabled, похоже, не работает. Все записи включены, независимо от того, является ли bool истинным или ложным.
Другая проблема заключается в том, что стратегия кэширования, по-видимому, нарушает представление списка, она отображает только около 8 записей с видимыми их элементами, тогда все остальные элементы просмотра имеют одинаковый размер и полностью пусты от меток, которые должны быть внутри них, есть ли у них привязка для IsVisible / IsEnabled или нет.
Некоторым дополнительным фоном является то, что некоторые элементы отображаются / скрываются с помощью конвертера на bool, отрицательного преобразователя, который я использую.
<ListView
x:Name="MyListView"
CachingStrategy="RetainElement"
HasUnevenRows="True"
ItemsSource="{Binding items}">
<Label
Margin="2.5"
FontAttributes="Bold"
HorizontalOptions="StartAndExpand"
Text="{Binding issuedDate}"
VerticalOptions="FillAndExpand" />
<StackLayout
HorizontalOptions="FillAndExpand"
IsVisible="{Binding isBoolOne, Converter={Helpers1:InverseBoolConverter}}"
Orientation="Horizontal"
VerticalOptions="StartAndExpand">
<StackLayout HorizontalOptions="StartAndExpand" VerticalOptions="FillAndExpand">
<Label
FontSize="Small"
Text="Sample Text"
TextColor="RoyalBlue" />
<Label FontSize="Default" Text="{Binding SampleStringOne}" />
</StackLayout>
<StackLayout HorizontalOptions="EndAndExpand" VerticalOptions="FillAndExpand">
<Label
FontSize="Small"
HorizontalTextAlignment="End"
Text="Sample Date"
TextColor="RoyalBlue" />
<Label
FontSize="Default"
HorizontalTextAlignment="End"
Text="{Binding SampleDate}" />
</StackLayout>
<StackLayout
HorizontalOptions="FillAndExpand"
IsVisible="{Binding isBoolTwo}"
VerticalOptions="StartAndExpand">
<Label
FontSize="Small"
HorizontalTextAlignment="Start"
Text="Sample Number"
TextColor="RoyalBlue" />
<Label
FontSize="Default"
HorizontalTextAlignment="Start"
Text="{Binding SampleStringTwo}" />
</StackLayout>
<StackLayout
HorizontalOptions="FillAndExpand"
IsVisible="{Binding isBoolOne}"
VerticalOptions="StartAndExpand">
<Label
FontSize="Default"
HorizontalTextAlignment="Start"
Text="{Binding SampleStringOne}" />
</StackLayout>
Ожидаемый результат состоит в том, что просмотр списка будет отображать ячейки с изменяющимся размером на основе данных, которые они включили. Так, например, если isBoolOne имеет значение true, первый макет стека будет отключен, а если isBoolTwo имеет значение true, следующий стековый макет должен быть включен, а поскольку isBoolOne имеет значение true, последний стековый макет должен быть включен. Вместо этого все 3 из них отображаются независимо от того, что.
Я попытался выполнить отладку для отображения каждого bool в консоли из источника элементов, и они читаются правильно, без нулей и изменяя значения true / false, как и ожидалось. Все привязки строк отображаются правильно. Все привязки bool кажутся истинными.
Вторая проблема заключается в том, что в стратегии кэширования retainelement видны только первые несколько элементов, остальные - пустые. С элементом recycle все они отображаются, но, как я понимаю, это предотвратит изменение элементов, включенных в каждом.
РЕДАКТИРОВАТЬ: я должен пояснить, что я опустил некоторые из XAML, включая ListView.ItemTemplate, DataTemplate, ViewCell, Frame и AbsoluteLayout, которые охватывают то, что я показал. Я сделал это, чтобы минимизировать показанный код и отображать только проблемные области.