[英]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.