我有一个可从我的ViewModel获得的AttendanceClass POCO对象列表:
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>
你看,我引用了学生列表中的第一项。预期的结果是在Tab键选项时,Label会更新另一个值。 在Android上,这似乎工作了一段时间,但突然停止对按钮作出反应。在控制台输出中,我经常看到&#34;垃圾收集&#34;错误开始时的消息。所以我想它,不知何故得到了GC&#39; ed。 在iPhone上,它根本不对按钮选项卡做出反应。
当按钮被选项卡时,它运行此代码,使用Realm进行保存,我还希望realm对象通知UI:
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()}");
}
}
答案 0 :(得分:0)
原来,摆脱Realm,是解决方案。 我删除了模型类上RealmObject的依赖项,并自己处理了属性通知。这消除了这个错误。
我不能推荐Realm。它的引擎发生了太大的魔力,而没有作为开发人员控制它。此外,它对模型类的类型以及如何与它们进行交互限制太多。
我现在去Sqlite处理离线体验。