问题描述
我在 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。