繁体   English   中英

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

[英]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);
        //...
    }
}

其余的实现应该是无关紧要的。 我的目标是拥有预先选择的值。

第一:我注意到,如果TObservableCollection<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 团队将修复该.

SelectedItems是只读的,您不能像SelectedItems="{Binding SelectedCategoryItems}"那样使用在此处输入图片说明

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

CategoryColView.SelectedItems.Add(your selectItem 1);
CategoryColView.SelectedItems.Add(your selectItem 2);
CategoryColView.SelectedItems.Add(your selectItem 3);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM