невозможно скрыть строки / уменьшить элементы списка в виде списка с помощью свойства visible и привязки mvvm - PullRequest
0 голосов
/ 24 мая 2019

У меня есть кнопка переключения и список (в котором есть строки или метки, макет стека в сетке). Toggle (Switch) и List List объявляются в Xaml-файле, где Data-ячейка списка генерируется программно в CS-файле. Мне нужно скрыть / показать этот макет стека, который находится внутри списка на основе тумблера.

Я добился этого, создав булево поле в объекте списка и присвоив ему значение true, когда переключение включено. И используя это поле в ISvisiblePraperty стека Layout

stacklayout.SetBinding(IsVisibleProperty, new Binding("SubItemSectionVisible", BindingMode.Default, new BooleanConverterForSubItem()));

Теперь я вижу, что текст в стеке-макете скрыт и виден в зависимости от переключателя, но размер элемента списка не уменьшается. Мне нужно прокрутить список один раз, чтобы увидеть, как элементы списка уменьшаются или расширяются. Есть ли способ добиться этого сокращения, как только я нажму на переключатель?

Эта проблема только в iOS, в Android она работает нормально, как и ожидалось.

спасибо.

1 Ответ

0 голосов
/ 24 мая 2019

В этом нет ничего нового с Xamarin Forms iOS. Это было давно, и, если честно, я не уверен, что Xamarin когда-либо предлагал правильное (эффективное) решение, но если оно существует, то проигнорируйте следующее. : -)

Это существовало некоторое время ...

https://developer.xamarin.com/samples/xamarin-forms/UserInterface/ListView/DynamicUnevenListCells/

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

Пользовательский контроль

using System;
using Xamarin.Forms;

namespace YourApplication.Controls
{
    public class CustomListView : ListView
    {
        public event EventHandler<int> ItemHeightChangedEvent;

        public void ItemHeightChanged(int index)
        {
            ItemHeightChangedEvent?.Invoke(this, index);
        }
    }
}

Пользовательский рендерер iOS

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using UIKit;
using System.ComponentModel;
using YourApplication.Controls;
using Foundation;

[assembly: ExportRenderer(typeof(CustomListView), typeof(YourApplication.iOS.CustomListViewRenderer))]

namespace YourApplication.iOS
{
    public class CustomListViewRenderer : ListViewRenderer
    {
        private CustomListView _formsListView;

        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);

            _formsListView = Element as CustomListView;

            if (_formsListView == null)
                return;

            _formsListView.ItemHeightChangedEvent += async (object sender, int index) =>
            {
                Control.ReloadRows(new NSIndexPath[] { NSIndexPath.FromRowSection(index, 0) }, UITableViewRowAnimation.Automatic);
            };
        }
    }
}

XAML

<localControls:CustomListView ItemsSource="{Binding Source}" ... >

Вам нужно будет прочитать о создании пользовательских средств визуализации (если вы еще не знакомы с их использованием), а затем все, что вам нужно сделать, это вызвать метод ItemHeightChanged для элемента, когда клеточные изменения.

Производительность может быть сомнительной (поэтому стоит атаковать только те элементы, которые изменились), но у меня это сработало.

Надеюсь, это имеет смысл, и, более того, надеюсь, это поможет.

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