Требуется повторное выполнение поведения Xamarin CollectionView

#c# #xamarin.forms #behavior #collectionview #bindable

#c# #xamarin.forms #поведение #collectionview #привязываемый

Вопрос:

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

XAML

 <CollectionView ItemsSource="{Binding}" Margin="-55,0,0,0">

    <CollectionView.ItemsLayout>
        <LinearItemsLayout Orientation="Vertical" ItemSpacing="0"/>
    </CollectionView.ItemsLayout>

    <CollectionView.Behaviors>
        <core:CollectionViewRectangleVerticleHeightBehavior/>
    </CollectionView.Behaviors>

    <CollectionView.ItemTemplate>
        <DataTemplate>
            ....
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>
  

Файл класса (не код позади)

 public class CollectionViewRectangleVerticleHeightBehavior : Behavior<CollectionView>
{
    bool hasHeightChanged = false;

    public CollectionView CollectionViewObject { get; private set; }

    protected override void OnAttachedTo(CollectionView bindable)
    {
        base.OnAttachedTo(bindable);
        CollectionViewObject = bindable;
        bindable.BindingContextChanged  = Bindable_BindingContextChanged;
        bindable.SizeChanged  = Bindable_SizeChanged;
    }

    ...

    private void Bindable_SizeChanged(object sender, EventArgs e)
    {
        if (!hasHeightChanged)
        {
            if (CollectionViewObject.BindingContext is Grouping<string,Estimate> grp)
            {
                CollectionViewObject.HeightRequest = (grp.Count * (32   grp.Count == 1 ? 0 : 66   50));
                hasHeightChanged = true;
            }
        }
    }

    ...
}
  

Он отлично работает с исходными данными, переданными ItemsSource . Однако, когда я добавляю записи ObservableCollection в viewmodel, поведение больше не запускается, что приводит к появлению полосы прокрутки.

Как мне заставить CollectionView «перерисовать» себя, чтобы поведение было запущено снова? В идеале, событие должно срабатывать, если вот-вот появится полоса прокрутки, и a предоставляет метод для вызова поведения для текущей строки. Я не нахожу ничего подобного в реальности.

Комментарии:

1. Я не понимаю, почему вы хотите заставить макет скрывать прокрутку, добавляя больше элементов, чтобы он наверняка включал прокрутку, учитывайте также разные размеры экрана, которые, возможно, потребуют прокрутки. С другой стороны, вы можете установить VerticalScrollBarVisibility и HorizontalScrollBarVisibility свойства Never , чтобы скрыть полосы прокрутки, и, возможно, добавить ItemsUpdatingScrollMode="KeepItemsInView" , но это не помешает прокрутке.

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

3. Поскольку вы просто меняете heightrequest CollectionViewObject в поведении, почему бы не изменить его в момент добавления или удаления элементов в collectionview?

4. Добавление / удаление происходит в viewmodel, у которого нет доступа к collectionview.

5. Привязка запроса heightrequest к свойству в виртуальной машине и обновление этого свойства при добавлении / удалении в viewmodel.