繁体   English   中英

CollectionView SelectionChange 事件在 Android (.Net MAUI) 中无法正常工作

CollectionView SelectionChange event not working properly in Android (.Net MAUI)

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试在 .Net MAUI 中创建自定义选项卡控件,为此,我首先尝试使用 ScrollView 和 BindableStackLayout 控件,但在这方面,我遇到了问题。

在此处报告带有 ScrollView 错误的自定义选项卡

因此,作为一种替代方法或解决方法,我尝试使用 CollectionView 开发相同的选项卡控件。

这种替代方法在 iOS 中运行良好,但在 Android 中无法正常运行。

Android和iOS都有一个问题。 我已将 BoxView 控件用作所选选项卡的指示器。 我将只为 Selected 选项卡显示,但这仅显示在第一个选项卡中,当我单击其他选项卡时,选项卡会发生更改,但它不会从第一个选项卡中隐藏并在另一个选定的选项卡中可见。

我已经为所选状态使用了带有白色的可视状态管理器,因为它看起来像我正在尝试使用 BoxView 创建的指示器。 但这也仅在该视图为 iOS 加载时才显示 Android 的 Selected 项目我必须先选择选项卡,然后它才在那里显示选定的颜色。

这是我所做的:

主页.xaml

<ContentPage.Content>

    <Grid RowDefinitions="50, *" RowSpacing="0">

        <CollectionView x:Name="TabsView"
                        Grid.Row="0"
                        ItemsSource="{Binding Tabs,Mode=TwoWay}"
                        ItemsUpdatingScrollMode="KeepItemsInView"
                        ItemSizingStrategy="MeasureAllItems"
                        SelectedItem="{Binding SelectedTab}"
                        SelectionChangedCommand="{Binding Path=BindingContext.TabChangedCommand,Source={x:Reference TabsView}}"
                        SelectionChangedCommandParameter="{Binding SelectedTab}"
                        SelectionMode="Single">

            <CollectionView.ItemsLayout>
                <LinearItemsLayout Orientation="Horizontal"/>
            </CollectionView.ItemsLayout>

            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid RowSpacing="0" RowDefinitions="*, 3">
                        
                        <Label Grid.Row="0"
                                    Text="{Binding TabTitle}"
                                    TextColor="White"
                                    BackgroundColor="navy"
                                    Padding="20,0"
                                    VerticalTextAlignment="Center"
                                    HorizontalTextAlignment="Center"
                                    FontSize="12" />
                        <BoxView Grid.Row="1" Color="{Binding BoxColor}"
                                    IsVisible="{Binding IsSelected}"/>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup Name="CommonStates">
                                <VisualState Name="Normal"/>
                                <VisualState Name="Selected">
                                    <VisualState.Setters>
                                        <Setter Property="BackgroundColor" Value="White" />
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </DataTemplate>

            </CollectionView.ItemTemplate>
        </CollectionView>

        
        <tabs:ParentRecordTabView Grid.Row="1"
                                    IsVisible="{Binding IsParentRecordTabVisible}"
                                    VerticalOptions="FillAndExpand"/>

        <tabs:AdditionalInfoTabView Grid.Row="1"
                                    IsVisible="{Binding IsAdditionalInfoTabVisible}"
                                    VerticalOptions="FillAndExpand" />
        


    </Grid>

</ContentPage.Content>

MainPageViewModel.cs

public class MainPageViewModel : BaseViewModel
{
    public MainPageViewModel()
    {
        GetTabs();
    }

    private bool _isParentRecordTabVisible = true;
    private bool _isAdditionalInfoTabVisible;

    private ObservableCollection<TabViewModel> _tabs { get; set; }
    private TabViewModel _selectedTab { get; set; }

    public bool IsParentRecordTabVisible
    {
        get => _isParentRecordTabVisible;
        set { _isParentRecordTabVisible = value; OnPropertyChanged(nameof(IsParentRecordTabVisible)); }
    }

    public bool IsAdditionalInfoTabVisible
    {
        get => _isAdditionalInfoTabVisible;
        set { _isAdditionalInfoTabVisible = value; OnPropertyChanged(nameof(IsAdditionalInfoTabVisible)); }
    }

    public ObservableCollection<TabViewModel> Tabs
    {
        get => _tabs;
        set { _tabs = value; OnPropertyChanged(nameof(Tabs)); }
    }

    public TabViewModel SelectedTab
    {
        get => _selectedTab;
        set
        {
            _selectedTab = value;
            OnPropertyChanged(nameof(SelectedTab));
        }
    }

    public ICommand TabChangedCommand { get { return new Command<TabViewModel>(ChangeTabClick); } }

    private void GetTabs()
    {
        Tabs = new ObservableCollection<TabViewModel>();
        Tabs.Add(new TabViewModel { TabId = 1, IsSelected = true, TabTitle = "Parent record" });
        Tabs.Add(new TabViewModel { TabId = 2, TabTitle = "Additional Info" });
        Tabs.Add(new TabViewModel { TabId = 3, TabTitle = "Contacts" });
        Tabs.Add(new TabViewModel { TabId = 4, TabTitle = "Previous inspections" });
        Tabs.Add(new TabViewModel { TabId = 5, TabTitle = "Attachments" });

        SelectedTab = Tabs.FirstOrDefault();
    }

    public void ChangeTabClick(TabViewModel tab)
    {
        Tabs.All((arg) =>
        {
            if (arg.TabId == tab.TabId)
            {
                arg.IsSelected = true;
            }
            else
            {
                arg.IsSelected = false;
            }
            return true;
        });
        SelectedTab = Tabs.Where(t => t.IsSelected == true).FirstOrDefault();

        switch (SelectedTab.TabId)
        {
            case 1:
                IsParentRecordTabVisible = true;
                IsAdditionalInfoTabVisible = false;
                break;
            case 2:
                IsParentRecordTabVisible = false;
                IsAdditionalInfoTabVisible = true;
                break;
        }
    }
}

TabViewModel.cs

public class TabViewModel : BaseViewModel
{
    private bool _IsSelected;
    public bool IsSelected
    {
        get { return _IsSelected; }
        set
        {
            _IsSelected = value;
            OnPropertyChanged(nameof(IsSelected));
        }
    }

    private int _TabId;
    public int TabId
    {
        get { return _TabId; }
        set
        {
            _TabId = value;
            OnPropertyChanged(nameof(TabId));
        }
    }

    private string _TabTitle;
    public string TabTitle
    {
        get { return _TabTitle; }
        set
        {
            _TabTitle = value;
            OnPropertyChanged(nameof(TabTitle));
        }
    }
}

注意:同样的方法在 Xamarin.Forms (Visual Studio 2019) 中也可以正常工作,只是在 MAUI 中不起作用,所以有人注意到这样的事情吗?

如何重现错误:检查 github

1 个回复
  1. 删除项目中的 BoxView 默认样式。 资源> 样式> Styles.xml

     <Style TargetType="BoxView"> <Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
  2. 您可以使用IsVisible属性来显示或不显示BoxView ,而不是使用BoxColor绑定颜色。 删除CollectionView中的SelectionChangedCommandSelectionChangedCommandParameterVisualStateManager.VisualStateGroups

     <BoxView Grid.Row="1" Color="Yellow" IsVisible="{Binding IsSelected}"/>
  3. 设置SelectedTab属性,如下所示。

     public TabViewModel SelectedTab { get => _selectedTab; set { _selectedTab = value; SetSelection(); OnPropertyChanged(nameof(SelectedTab)); } } private void SetSelection() { foreach (var item in Tabs) { item.IsSelected = false; } SelectedTab.IsSelected = true; }

在此处输入图像描述

在此处输入图像描述

2 集合视图阻止选择更改

我遇到了可能与 collectionview 相关的问题。 问题似乎是每个组都会跟踪自己的选择器,这将阻止程序在我选择前一组中的先前选择的项目时触发新的 SelectionChanged 事件。 例子: 第 1 组: 第 1 行第 2 行(已选择) 第 2 组: 第 1 行(已选择) 如果我首先 ...

5 .NET MAUI WebAuthenticatorResult 不适用于 Strava

我正在创建一个 .NET MAUI 应用程序,它将从 Strava API 获取一些数据。 当我尝试使用 WebAuthenticatorResult 类来获取访问令牌时,传递 URI 和 callbackURI 我收到以下错误: 我得到的错误 我正在使用的代码是这样的: 我试图运行的代码 在 ...

9 .net Maui 在单击按钮时访问 CollectionView 中的数据项

伙计,这就像穿过糖浆:( 好的,所以我在一个名为 models 的文件夹中有一个类。 我在一个名为 ViewModels 的文件夹中有一个视图模型和一个显示蓝牙连接列表的页面 - 不要兴奋,它只是虚拟数据:sigh 所以这是代码 BluetoothPeripheral.cs 和 Blu ...

10 在 .Net MAUI 中获取 Android CurrentActivity

我正在将 Xamarin.Android 项目移植到 .Net 6。 由于依赖关系,无法在 .Net 6 项目中包含 Xamarin.Essentials。 因此,我将所有内容都切换为使用 Microsoft.* 命名空间。 这很容易,除了 Xamarin.Essentials.Platform ...

暂无
暂无

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

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