Вложенный объект в Listview, похоже, собирает мусор, не получая уведомления об измененных свойствах - PullRequest
0 голосов
/ 09 мая 2018

У меня есть список объектов 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()}");
        }
    }

1 Ответ

0 голосов
/ 14 мая 2018

Оказывается, что избавление от Царства было решением. Я удалил зависимость для RealmObject от классов модели и обработал уведомление свойства самостоятельно. Это убрало ошибку.

Я не могу рекомендовать Царство. Слишком много волшебства происходит в его движке, не имея контроля над ним в качестве разработчика. Также это слишком ограничивает типы типов классов и взаимодействие с ними.

Теперь я использую Sqlite для работы в автономном режиме.

...