短:
当项目源更改时,有什么方法可以防止 CollectionView 动画?或者也许我可以使用一些替代的东西?
长:
我有一组按钮,我想以类似网格的方式显示:
public ObservableCollection<ButtonData> Buttons { get; set; } = new ObservableCollection<ButtonData>();
重点是集合的大小在运行时会发生变化,它可以是 3x3=9、4x4=16 或 5x5=25。为了以方形格式显示它,我决定使用
CollectionView
:
<CollectionView ItemsSource="{Binding Buttons}" >
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" Span="{Binding Size}" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Button
Text="{Binding Text}"
Command="{Binding Command}"
BackgroundColor="{Binding BackgroundColor}"
TextColor="Black"
CornerRadius="0"
FontSize="24"
Opacity="{Binding Opacity}"
HeightRequest="{Binding Height}"
AutomationId="{Binding Text}"
/>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
我的问题是,每当我更改底层集合时,视图都会动画化。我想防止这种情况发生,只显示新项目而不使用任何动画。有什么办法可以做到吗?
我一直在尝试以编程方式从 XAML 背后的代码更改网格,但这对于 MVVM 方法来说似乎是一场灾难;我仍然遇到了
bindings
上的其他 Button
的问题。
问题是您正在使用
ObservableCollection
,根据设计,它会通知集合的每次更改。如果您不希望发生这种情况,那么您可以更改为更简单的类型,例如
// With CommunityToolkit.Mvvm.
[ObservableProperty]
property IList<ButtonData> _buttons;
// Or without CommunityToolkit.Mvvm.
property IList<ButtonData> Buttons { get; set; }
// but you will have to implement and invoke INotifyPropertyChanged yourself.
使
Buttons
属性可观察意味着当为该属性分配新列表时,您将生成更改事件。