在我的应用程序中,我有一个绑定到 ObservableCollection 的 ListView。我正在尝试将列表视图的 DataTemplate 设置为名为 CourseCard 的 xaml 文件,并将 CourseCard 的 BindingContext 设置为我的 CourseCardViewModel 并将该视图模型的 Course 属性设置为列表中的 Course 对象。
这是我的代码:
MainPage.xaml
<ListView ItemsSource="{Binding Courses}">
<ListView.ItemTemplate>
<DataTemplate>
<views:CourseCard>
<views:CourseCard.BindingContext>
<vm:CourseCardViewModel>
<vm:CourseCardViewModel.Course>
<Binding Path="." />
</vm:CourseCardViewModel.Course>
</vm:CourseCardViewModel>
</views:CourseCard.BindingContext>
</views:CourseCard>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这可能吗?我是不是太复杂了?目标是让一组动态的 CourseCards 出现在代表 Course 对象的 mainpage.xaml 上。我还在学习所以对我放轻松。
IDE 不喜欢我的代码说:
Error XFC0009 找不到“课程”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。
我的 CourseCardViewModel 中确实有一个公共属性:
//CourseCardViewModel.cs
private Course _course;
public Course Course
{
get { return _course; }
set
{
_course = value;
OnPropertyChanged();
}
}
编辑
抱歉没有提供更多背景信息。这是有关我正在尝试做的事情的更多详细信息:
我有一个 MainPage.xaml 和一个 MainPageViewModel.cs
我有一个 CourseCard.xaml 和一个 CourseCardViewModel.cs
ObservableCollection“课程”位于 MainPageViewModel.cs 中
我想要 MainPage.xaml 上的 CourseCards 列表,同时维护处理 CourseCards 事件和数据的 CourseCardViewModel 的属性和方法。
我是否应该废弃 CourseCard viewModel 并将属性和方法移动到我的 mainpageviewmodel 以使其不那么复杂?
ListView 使用 ItemsSource 属性填充数据,它可以接受任何实现 IEnumerable 的集合
在 ViewModel 中,您可以创建 Course 的集合:
public ObservableCollection<Course> Courses { get; set; } = new ObservableCollection<Course>();
然后在 xaml 中,只需为 CollectionView 设置 ItemsSource:
<ListView ItemsSource="{Binding Courses}">
<ListView.ItemTemplate>
<DataTemplate>
<views:CourseCard/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
DataTemplate 中每个 CourseCard 的默认 BindingContext 是您课程中的对应课程。
不要忘记在后面的代码中为页面设置 BindingContext:
public MainPage()
{
InitializeComponent();
this.BindingContext = new CourseCardViewModel();
}
更多信息,您可以参考ListView数据源
希望有用
<!-- Delete this -->
<views:CourseCard.BindingContext>
<vm:CourseCardViewModel>
<vm:CourseCardViewModel.Course>
<Binding Path="." />
</vm:CourseCardViewModel.Course>
</vm:CourseCardViewModel>
</views:CourseCard.BindingContext>
BindingContext = new CourseCardViewModel();
(在 InitializeComponent() 之后),或在其 XAML 中执行等效操作(未显示)。public CourseCard()
{
InitializeComponent();
BindingContext = new CourseCardViewModel();
}
或者如果 vm 是构造函数的参数,
public CourseCard(CourseCardViewModel ccvm)
,然后BindingContext = ccvm;
.