Listview上的嵌套对象似乎收集了垃圾,没有收到已更改属性的通知

时间:2018-05-09 10:44:31

标签: .net xamarin.forms realm realm-mobile-platform

我有一个可从我的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()}");
        }
    }

1 个答案:

答案 0 :(得分:0)

原来,摆脱Realm,是解决方案。 我删除了模型类上RealmObject的依赖项,并自己处理了属性通知。这消除了这个错误。

我不能推荐Realm。它的引擎发生了太大的魔力,而没有作为开发人员控制它。此外,它对模型类的类型以及如何与它们进行交互限制太多。

我现在去Sqlite处理离线体验。