CollectionView, SelectedItems="{Binding SelectedElement, Mode=TwoWay}" 无效

CollectionView, SelectedItems="{Binding SelectedElement, Mode=TwoWay}" Didn't work

我试图在我的视图和我的 ViewModel 之间绑定我的 CollectionView 的“SelectedItems”属性。但是 TwoWay 没有用。

我可以将信息发送到我的视图,但我无法将信息发送到我的视图模型。

(所有其他出价均正常工作)

一些代码,在我的 ViewModel 中:

        private ObservableCollection<Element> _selectedElement;
        public ObservableCollection<Element> SelectedElement
        {
            get
            {
                return _selectedElement;
            }
            set
            {
                if (_selectedElement != value)
                {
                    _selectedElement = value;

                }
            }
        }

在我看来

<CollectionView  ItemsSource="{Binding Elements,Mode=TwoWay}" 
                             SelectionMode="Multiple"
                             SelectedItems="{Binding SelectedElement, Mode=TwoWay}">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout  Orientation="Horizontal" >
                            
                            <StackLayout   Padding="15,10" Orientation="Horizontal" >
                                <Label Text="{Binding Libelle}" VerticalOptions="Center" />
                                <Label Text="{Binding Code}" VerticalOptions="Center" />
                            </StackLayout>
                            
                            <StackLayout HorizontalOptions="EndAndExpand" VerticalOptions="Center" >
                                <ImageButton Source="{Binding ImgFavori}"
                                                 BackgroundColor="Transparent"
                                                 Command="{Binding Path=BindingContext.ManageFavCommand, Source={x:Reference CurrentView}}"
                                                 CommandParameter="{Binding .}"
                                                 WidthRequest="75" 
                                                VerticalOptions="Fill"/>
                            </StackLayout>
                            
                            </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

当我像这样使用 ViewModel 操作视图时:

private async void ClearCollection()
{
    SelectedElement = null;
}

这是工作。

但是当我尝试 select 我的智能手机上的某些行时,我从未传递 SelectedElement 的 setter。

我正在使用 Xamarin.Forms 5.0.0.2196

谢谢你的帮助。

需要进行两项更改:

  1. 绑定的类型 属性 (SelectedElement) 必须匹配 CollectionView 的类型 属性 (SelectedItems)。 XF Doc 表示类型是 IList<object>.

  2. 您的绑定 属性(如果类型正确)将在解析绑定时(页面加载;BindingContext 设置)设置到 SelectedItems 列表。它开始时是一个空列表。随着选择的改变,列表的内容也会改变。 但是列表对象本身是同一个对象,所以 setter 再也不会被调用。

那么您如何看待变化?通过 SelectionChangedCommand, or SelectionChanged event.


使用SelectionChangedCommand:

添加到 CollectionView XAML:

<CollectionView ... SelectionChangedCommand="{Binding SelectionChangedCommand}" ...>

添加到视图模型(您的 BindingContext):

    // There's no point in customizing this setter, because it won't get called when you want it to.
    public IList<object> SelectedElement { get; set; }

    // in constructor:
         SelectionChangedCommand = new Command(SelectionChanged);

    public Command SelectionChangedCommand { get; set; }

    private void SelectionChanged(object obj)
    {
        if (SelectedElement != null && SelectedElement.Count > 0) {
            var element = SelectedElement[0] as Element;
            ...
        }
    }

在你的帮助下我找到了我的问题。

我不需要使用 SelectionChangedCommand(他工作但我不需要这个事件,我只需要数据)

但是为了尝试你的回答,我添加了这个:

SelectionChangedCommandParameter="{Binding .}

现在我的 IList SelectedElement 在我的视图中选择了数据!

谢谢你的帮助。