新的Xamarin.Forms CollectionView不允许多重预选

时间:2019-07-24 13:15:29

标签: c# xamarin xamarin.forms

我的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仍然是越野车?

2 个答案:

答案 0 :(得分:1)

froala-view是只读的,在xaml中不能像SelectedItems那样使用 enter image description here

您可以尝试更改背后的代码,例如:

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