[英]New Xamarin.Forms CollectionView doesn't allow multi pre-selection
我的 Xamarin.Forms 项目中有一个 CollectionView:
<CollectionView ItemsSource="{Binding Categories}" ItemSizingStrategy="MeasureFirstItem" x:Name="CategoryColView"
SelectionMode="Multiple" SelectionChangedCommand="{Binding SelectionChangedCommand}"
SelectionChangedCommandParameter="{Binding Source={x:Reference CategoryColView}, Path=SelectedItems}"
SelectedItems="{Binding SelectedCategoryItems}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout ...>
<BoxView .../>
<StackLayout ...>
<Label .../>
<Image .../>
</StackLayout>
<BoxView/>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
我包含了整个 XAML 元素,但唯一重要的部分是SelectedItems
属性。 它绑定到以下视图模型实现:
class ViewModel {
private ObservableCollection<object> selectedCategories { get; set; }
public ObservableCollection<object> SelectedCategories {
get => selectedCategories;
set {
selectedCategories = value;
OnPropertyChanged();
}
//...
ctor() {
//...
var alreadySelectedCategoryItems = alreadySelectedCategories.Select(pc => new CategoryItem { PlantCategory = pc, IsSelected = true }).Cast<object>();
SelectedCategoryItems = new ObservableCollection<object>(alreadySelectedCategoryItems);
//...
}
}
其余的实现应该是无关紧要的。 我的目标是拥有预先选择的值。
第一:我注意到,如果T
中ObservableCollection<T>
不是object
,一切都将被忽略。 就像这里的微软示例一样。 如果T
是例如CategoryItem
类型,那么实际上什么也不会发生,就好像ObserveableCollection
被完全忽略了一样。
第二: alreadySelectedCategoryItem
在调试器模式下包含 2 个元素,但是构造函数中的最后一行抛出:
System.ArgumentOutOfRangeException
指数超出范围。 必须是非负的并且小于集合的大小。
参数名称:索引
当然,由于这是 Xamarin.Forms 和 VS for Mac,错误是在 Main 函数上抛出的,而不是在它的实际位置......
我做错了什么,还是 CollectionView 仍然有问题?
问题是我正在创建新的CategoryItem
实例作为预选的实例,这是无效的,因为它们默认情况下与CollectionView.ItemsSource
属性中的实例不同。 我应该过滤 ItemsSource 实例并将它们作为预选的实例。 像这样:
var alreadySelectedCategoryItems = alreadySelectedCategories.Select(pc => new CategoryItem { PlantCategory = pc, IsSelected = true }).Cast<object>();
SelectedCategoryItems = Categories
.Where(sci =>
alreadySelectedCategoryItems.Any(alreadySelected =>
alreadySelected.PlantCategory.Id == sci.PlantCategory.Id);
所以这些项目是从 ItemsSource 本身中选择出来的,而不是作为新的。
尽管错误消息并不符合预期,但Xamarin.Forms 团队将修复该.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.