微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从另一个页面的 BindingContext 向 CollectionView 添加数据

如何解决如何从另一个页面的 BindingContext 向 CollectionView 添加数据

我在 MainPage 上有下面的单击按钮,它工作正常,如果我将(绑定)数据传递到第二页(CourseDetailViewPage)中的标签,我可以看到显示的数据;

但现在我想在位于第二页 (CourseDetailPage) 的集合视图中显示数据。

//Click button in MainPage
        public async void OnOkGetCourseButton(object sender,EventArgs e)
        {
            var inputtedCourseNumber = ctrlEntryTextBox.Text;

            if(inputtedCourseNumber == string.Empty)
            {
                await displayAlert("Note","\nPlease enter your Course number","OK");
            }
            else
            {
                try
                {

                    CourseService CourseService = new CourseService();
                    var data = await CourseService.getCourses();

                    var userCourse = data.Where(x => x.Id.ToString() == inputtedCourseNumber).FirstOrDefault();

                    UserDialogs.Instance.HideLoading();

                    if (userCourse == null)
                    {
                        await displayAlert("Note","\nCourse number does not exist. Verify your Course number","OK");
                    }
                    else
                    {
                        await displayAlert("Note","\nOurahh - Course number found !!!","OK");

                        await displayAlert("Note","\n" + userCourse.Id + "\n" + userCourse.CourseDetail + "\n" + userCourse.IsCourseComplete + "\n" + userCourse.CourseDate,"OK");



                        await Navigation.PushAsync(new CourseDetailPage
                        {
                            BindingContext = userCourse as Course
                        });


                    }
                }
                catch (Exception)
                {
                    await displayAlert("Error","Error Network","OK");
                }
            }
        }
    

======

// CourseDetailPage (Second page)
        
        <CollectionView x:Name="myCollection" ItemsSource="{Binding userCourse}" 
                            HeightRequest="200">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid RowDeFinitions="Auto,Auto,Auto">
                    <Label Grid.Row="0" Text="{Binding Id}"/>
                    <Label Grid.Row="0" Text="{Binding CourseDetail}"/>
                    <Label Grid.Row="0" Text="{Binding IsCourseComplete}"/>
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView> 

解决方法

改变

await Navigation.PushAsync(new CourseDetailPage
{
    BindingContext = userCourse as Course
});

ObservableCollection<Course> courses = new ObservableCollection<Course>();
courses.Add(userCourse);
await Navigation.PushAsync(new CourseDetailPage
{
    BindingContext = courses
});

原因:您需要将 collection 传递给 ItemsSource。在这种简单的情况下,它不必是“可观察的”集合,但在更动态的使用中,代码在显示项目列表的同时添加/删除元素,这可能是您想要的。所以我在这里使用它,作为一个好习惯。

改变

<CollectionView x:Name="myCollection" ItemsSource="{Binding userCourse}" 
                HeightRequest="200">

<CollectionView x:Name="myCollection" ItemsSource="{Binding .}" 
                HeightRequest="200">

原因:在第一个代码更改中,我们将新 CourseDetailPage 的 BindingContext 设置为要用作 ItemsSource 的集合。 "{Binding .}" 是一种引用 BindingContext 本身的方式。在这种情况下,BindingContext 用作 ItemsSource 的列表。


注意:虽然上述方法应该有效,但它是有限制的。它不提供任何方式将其他值传递到 CourseDetailPage 的其他部分。如果你发现你想传递 userCourse 和其他一些信息,那么它会稍微复杂一些。

定义一个具有公共属性 Courses 的类,并将该类的一个实例作为 BindingContext 传递。那么 ItemsSource 将是 {Binding Courses}:

public class Details
{
    public property ObservableCollection<Course> Courses { get; set; }
    public property int Prop2 { get; set; }
}

...
ObservableCollection<Course> courses = new ObservableCollection<Course>();
courses.Add(userCourse);
var details = new Details { Courses = courses,Prop2 = 123 };

await Navigation.PushAsync(new CourseDetailPage
{
    BindingContext = details 
});

...
<CollectionView x:Name="myCollection" ItemsSource="{Binding Courses}" 
                HeightRequest="200">

... some other view that uses `..="{Binding Prop2}"` ...

这是数据的“单向”显示。如果用户需要与数据交互,请查看MVVM

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。