我的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
,那么一切都会被忽略。就像在Microsoft的示例here中一样。如果T
是类型为CategoryItem
的话,实际上什么也没发生,好像ObserveableCollection
被完全忽略了。
第二个:alreadySelectedCategoryItem
在调试器模式下包含2个元素,但是构造函数的最后一行抛出一个:
System.ArgumentOutOfRangeException
索引超出范围。必须为非负数,并且小于集合的大小。
参数名称:索引
当然,由于这是Xamarin.Forms和VS for Mac,因此错误将抛出在Main函数上,而不是在其实际位置上。
我做错什么了吗,还是CollectionView仍然是越野车?
答案 0 :(得分:1)
froala-view
是只读的,在xaml中不能像SelectedItems
那样使用
您可以尝试更改背后的代码,例如:
SelectedItems="{Binding SelectedCategoryItems}"
答案 1 :(得分:1)
问题是我正在创建新的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 team is going to fix that。