如何使一个项目从代码中选择,但禁止用户选择在集合视图在.NET 7的MAUI?

wsxa1bj1  于 2023-03-04  发布在  .NET
关注(0)|答案(2)|浏览(124)

我正在处理一个. NET 7 MAUI项目,想从C#更改CollectionView上某个特定项的样式。目前它正在工作,但所有其他项也可以在CollectionView上选择。如何禁止用户选择项,同时仍然从代码隐藏中选择项?
这是选择一个项目的代码:

SelectedItem = Items.FirstOrDefault(x => x.IsSelectedNext);
<CollectionView
                    SelectionMode="Single"
                    ItemsSource="{Binding Items}" 
                    SelectedItem="{Binding SelectedItem}">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
            <Grid
             ColumnDefinitions="*, Auto">
                <Label 
                    VerticalOptions="EndAndExpand"
                Text="{Binding FullName}" />

                <HorizontalStackLayout Grid.Column="1">
                    <Label 
                        Text="{Binding Time}"/>

                    <Label
                        Text="{Binding TimePostfix}"/>
                </HorizontalStackLayout>
            </Grid>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>

我尝试使用CollectionView. SelectionMode ="None",但这也隐藏了从c#中完成的选择。当我尝试使用CollectionView. SelectionMode ="Single"时,我可以看到它,但也可以选择CollectionView上的其他项目。

y4ekin9u

y4ekin9u1#

你在android上测试过吗?似乎windows和ios上有一个关于CollectionView selection does not display selection when page appearing的bug。在我的项目中,SelectedItem不能在后面的代码中设置。
另外,我创建了一个示例,在android上得到了你想要的效果。你可以在CollectionView的SelectedItemChanged事件中添加一些逻辑代码,根据你的需要设置SelectedItem。例如:

collectionview.SelectionChanged += (s, e) =>
   {  
       if (collectionview.SelectedItem != Items.FirstOrDefault(x => x.IsSelectedNext))
       {
          collectionview.SelectedItem = Items.FirstOrDefault(x => x.IsSelectedNext);
       }
   };

你可以把下面的代码放在后面的代码中,如果你使用了视图模型,你可以使用EventToCommandBehavior把这个事件转换成视图模型中的一个命令。
另外,我试过Arvis提到的InputTransparent="True"属性,它会使集合视图不能滚动,看起来像被禁用了。

gstyhher

gstyhher2#

1.由于您希望禁用用户与项目选择的交互,因此不再真实的使用SeletctedItem(您在代码中获得项目),您可以只自定义自己的DataTemplate样式,并基于某个项目属性(可能是IsSelectedNext)设置UI可视化,然后设置SelectionMode="None"

<CollectionView ItemsSource="{Binding Items}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid ColumnDefinitions="*, Auto">
                    <Grid.Triggers>
                        <DataTrigger TargetType="Grid" Binding="{Binding IsSelectedNext}" Value="true">
                            <Setter Property="BackgroundColor" Value="Orange" />
                        </DataTrigger>
                    </Grid.Triggers>
                    <Label VerticalOptions="EndAndExpand" Text="{Binding FullName}" />
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>

1.最快的变通方法(不建议用于大型集合)。将InputTransparent="True"属性设置为CollectionView,并将集合放入ScrollView

相关问题