У меня есть список объектов POCO AttendanceClass, доступных из моей ViewModel:
private List<AttendanceClass> _Classes;
public List<AttendanceClass> Classes
{
get { return _Classes; }
set { SetProperty(ref _Classes, value); }
}
Объект AttendanceClass имеет вложенные объекты:
public class AttendanceClass : RealmObject
{
public IList<AttendanceStudent> Students { get; }
}
public partial class AttendanceStudent : RealmObject
{
public int CheckOffReasonID { get; set; }
}
Мой XAML:
<ListView x:Name="AttendanceListView"
ItemsSource="{Binding Classes}"
VerticalOptions="FillAndExpand"
RefreshCommand="{Binding RefreshCommand}"
IsPullToRefreshEnabled="true"
IsRefreshing="{Binding IsBusy, Mode=OneWay}"
CachingStrategy="RecycleElement"
SeparatorColor="LightGray"
HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="10" BackgroundColor="White">
<Label FontSize="7" Text="{Binding Students[0].CheckOffReasonID}"></Label>
<Button Text="Toggle" Command="{Binding Path=BindingContext.TogglePresentCommand, Source={x:Reference Name=AttendanceListView}}" CommandParameter="{Binding .}"></Button>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Видите ли, я ссылаюсь на первый пункт в списке студентов. Ожидаемый результат заключается в том, что при закладке кнопки метка обновляется с другим значением.
На Android это, кажется, работает некоторое время, но внезапно перестает реагировать на кнопку. В выводе консоли я часто вижу сообщение «сборщик мусора», когда начинает появляться ошибка. Так что я полагаю, что каким-то образом получает GC.
На iPhone он вообще не реагирует на вкладку кнопки.
Когда кнопка вкладка, он запускает этот код, который сохраняет с помощью Realm, в котором я также ожидаю, что объект области уведомляет пользовательский интерфейс:
private void TogglePresent(AttendanceClass attClass)
{
var student = attClass.Students[0];
try
{
RealmHelper.Database.Write(() =>
{
student.CheckOffReasonID = student.CheckOffReasonID == PresentId ? 0 : PresentId;
});
}
catch (Exception e)
{
Console.WriteLine($"Exception:{e.ToString()}");
}
}