簡體   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