Как правильно установить для CachingStrategy значение RecycleElement в формах Xamarin? - PullRequest
0 голосов
/ 18 февраля 2020

Я получаю сообщение об ошибке (но мой код все еще работает с ним, поэтому я игнорировал его до сих пор), говоря, что мой BindableListView is not usable as an object element because it is not public or does not define a public parameterless constructor or a type converter.

Я предполагаю, что это является причиной другого брака sh Я получаю: System.ObjectDisposedException: Cannot access a disposed object. Object name: 'Xamarin.Forms.Platform.Android.FormsTextView', потому что я видел предложения онлайн, говорящие, что большую часть времени эта проблема связана с ListView, и что я должен установить CachingStrategy в RecycleElement.

Поэтому я решил наконец взглянуть на BindableListView и добавить в CachingStrategy = "RecycleElement"

Теперь уже реализован некоторый код, который, кажется, попробуйте добавить CachingStrategy уже:

BindableListView.cs:

namespace MyApp.Core.Controls
{
    [PropertyChanged.DoNotNotify]
    public class BindableListView : ListView
    {
        public static BindableProperty ItemClickedProperty = BindableProperty.Create(nameof(ItemClicked), typeof(ICommand), typeof(BindableListView));
        public static BindableProperty ItemAppearsProperty = BindableProperty.Create(nameof(ItemAppears), typeof(ICommand), typeof(BindableListView));
        public static BindableProperty AnimateScrollToSelectedItemProperty = BindableProperty.Create(nameof(AnimateScrollToSelectedItem), typeof(bool), typeof(BindableListView), true);

        /// <summary>
        /// Constructs a <see cref="BindableListView"/>
        /// </summary>
        /// <param name="cachingStrategy">Sets the caching strategy for the <see cref="ListView"/>.</param>
        /// <example><![CDATA[
        /// <controls:BindableListView>
        ///  <x:Arguments>
        ///    <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
        ///  </x:Arguments>
        /// </controls:BindableListView>
        /// ]]></example>
        public BindableListView(ListViewCachingStrategy cachingStrategy)
            : base(cachingStrategy)
        {
            ItemTapped += OnItemTapped;
            ItemAppearing += OnItemAppearing;
            ItemSelected += OnItemSelected;
    ...

Затем во всех файлах .xaml, которые используют этот ListView:

<controls:BindableListView
      ...>
      <x:Arguments>
        <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
      </x:Arguments>

Будет ли это правильный способ установить CachingStrategy для Recycle Element? Если так, то как мне go исправить ошибки (я)?

Или я должен удалить параметр из конструктора в BindableListView.cs, чтобы сделать его без параметров, а затем просто добавить одну строку CachingStrategy = "RecycleElement"? Я попробовал это, и ошибка, по крайней мере, исчезла (хотя приложение теперь не запускается, "отсутствует ctor по умолчанию"), но я не знаю, правильно ли это делать. Если это то, что я должен сделать, исправит ли это и мою вторую ошибку?

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Часть сообщения об ошибке, относящаяся к вашей ситуации:

... не определяет конструктор publi c без параметров ...

Измените это:

public BindableListView(ListViewCachingStrategy cachingStrategy)
            : base(cachingStrategy)
{
    ItemTapped += OnItemTapped;
    ItemAppearing += OnItemAppearing;
    ItemSelected += OnItemSelected;
    ...
}

На это:

public BindableListView(ListViewCachingStrategy cachingStrategy)
        : base(cachingStrategy)
{
    Init();
}

public BindableListView()
        : base()
{
    Init();
}

private void Init()
{
    ItemTapped += OnItemTapped;
    ItemAppearing += OnItemAppearing;
    ItemSelected += OnItemSelected;
    ...
}

Обратите внимание, что вы делаете хотите сохранить ваш параметризованный конструктор (XAML нуждается в этом); поэтому решение состоит в том, чтобы добавить второй (без параметров) конструктор.

Таким образом, у вас будут обе необходимые формы конструктора, и каждая из них выполнит вашу логику инициализации c.

0 голосов
/ 19 февраля 2020

Из вашего кода я думаю, что это правильный способ установить CachingStrategy для Recycle Element.

Согласно этому документу:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/performance

Решением этой проблемы является указание конструктора в подклассе ListView, который принимает параметр ListViewCachingStrategy и передает его в базовый класс:

public class CustomListView : ListView
{

   public CustomListView (ListViewCachingStrategy strategy) : base (strategy)
    {

    }
    ...
}

Тогда значение перечисления ListViewCachingStrategy может быть указано из XAML с помощью используя синтаксис x: Arguments

<local:CustomListView>
<x:Arguments>
    <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
</x:Arguments>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...