Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?

Posted

技术标签:

【中文标题】Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?【英文标题】:Xamarin.Forms how to transfer data from CollectionView to a different view? 【发布时间】:2022-01-08 06:57:14 【问题描述】:

我正在开发一个 xamarin 中的小项目,我编写了一个代码来在集合视图中显示我的项目。结果很好,但是当我单击加号按钮将其添加到我的订单后,我无法将项目转移到其他视图,我无法使用 get set 获取数据,请帮助。这是我的代码:

xaml

<ContentPage.Content>
    <StackLayout>
        <Frame BackgroundColor="AppThemeBinding Light=#F7F7F7, Dark=#191919"
               Padding="0, 15" CornerRadius="0" HasShadow="False">
            <StackLayout Orientation="Horizontal" VerticalOptions="Center" HorizontalOptions="Center" Spacing="10">
                <Image Source="breakfast" HeightRequest="50"/>
                <Label Text="Breakfast" HorizontalTextAlignment="Center" VerticalTextAlignment="Center"
                   TextColor="AppThemeBinding Light=Black, Dark=White" FontSize="30" FontAttributes="Bold"/>
            </StackLayout>
        </Frame>

        <StackLayout Padding="20" BackgroundColor="AppThemeBinding Light=White, Dark=Black" Spacing="50">

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <CollectionView ItemsSource="Binding Orders">
                    <CollectionView.ItemsLayout>
                        <GridItemsLayout Orientation="Vertical" VerticalItemSpacing="30"/>
                    </CollectionView.ItemsLayout>
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="100"/>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="50"/>
                                </Grid.ColumnDefinitions>

                                    <Image Source="Binding ImageURL"
                                           WidthRequest="50" HeightRequest="50"
                                           Grid.Column="0"/>
                                    <StackLayout Orientation="Vertical" Grid.Column="1">
                                        <Label x:Name="orderName" Text="Binding OrderName" FontSize="Title">
                                            <Label.GestureRecognizers>
                                                <TapGestureRecognizer Tapped="AddOrder" />
                                            </Label.GestureRecognizers>
                                        </Label>
                                        <Label Text="Binding Price, StringFormat='0$'" FontSize="Subtitle"/>
                                    </StackLayout>
                                    <ImageButton Grid.Column="2"
                                            Source="plus" HeightRequest="50" Clicked="AddOrder"/>

                            </Grid>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </Grid>

            <StackLayout Padding="0, 120, 0, 0">
                <ImageButton Source="back" HorizontalOptions="Center"
                         HeightRequest="60" Clicked="Back"/>
            </StackLayout>
        </StackLayout>
    </StackLayout>
</ContentPage.Content>

这是用户界面https://i.stack.imgur.com/QR133.png

之后我也尝试用 x:Name="addOrder" 分配 ImageButton 但我不能在 .cs 文件中使用它,

cs 文件:

public partial class Breakfast : ContentPage

    public Breakfast()
    
        InitializeComponent();
    

    void Back(object sender, EventArgs args)
    
        Application.Current.MainPage = new Main();
    

    async void AddOrder(object sender, EventArgs args)
    
        await this.DisplayToastAsync("added to orders", 3000);
    

按下加号按钮后,它正在运行 AddOrder 函数,因为 DisplayToastAsync(或弹出窗口)正在显示,没有问题,问题是如何将列表项移动到 我的订单 视图?

感谢所有答案和 cmets! ????

【问题讨论】:

" 我无法将项目转移到其他视图,我无法使用 get set 获取数据" 请添加以质疑您尝试的确切代码,并且编译器错误是什么。 (您无法传输项目,但有一种方法可以传输项目的文本 - 只需查看您所做的确切操作即可。) Google site:***.com xamarin forms transfer data to another view - 这些对你有帮助吗? 为什么有 GestureRecognizer 和 ImageButton?为什么不使用 CollectionView 内置的 Selected 机制呢?你的问题真的是“我如何确定哪个项目被点击了?” @ToolmakerSteve 我所做的只是为 ImageButton 分配 x:Name="buttonAdd" ,当我尝试使用该名称时,它无法识别名为“buttonAdd”的变量 @Jason 嘿,伙计,感谢您的回复,但如果您能够提供有关 Selected 机制的任何详细信息,它真的会有所帮助,我知道我可能听起来很菜鸟,但我参加了一门课程一个新手,所以我正在努力学习:\ 【参考方案1】:

你可以这样做

async void AddOrder(object sender, EventArgs args)

    var btn = (ImageButton)sender;
    var item = (MyClassName)btn.BindingContext;

    // navigate to the next page and pass item on the constructor
    Navigation.PushAsync(new MyNextPage(item));

【讨论】:

以上是关于Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?的主要内容,如果未能解决你的问题,请参考以下文章

将方法从后面的代码转换为 ICommand 数据绑定 Xamarin.Forms

如何使用 Xamarin.Forms/C# 将 mp3 从 youtube 下载到 android?

如何使用 Xamarin Forms 从 HealthKit 读取 ECG 数据

如何使用 Xamarin Forms 从 HealthKit 读取 ECG 数据

Xamarin.Forms Shell 将数据传递到弹出项视图

如何调整 xamarin.forms 中的图像大小?