#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.