如何在 ListView 的绑定上下文中为 DataTemplate 设置 ViewModel 属性?

问题描述 投票:0回答:2

在 DataTemplate 绑定上下文中设置 ViewModel 属性

在我的应用程序中,我有一个绑定到 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 以使其不那么复杂?

c# xamarin xamarin.forms mvvm xamarin.android
2个回答
0
投票

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数据源

希望有用


0
投票
  • 删除您在 ItemTemplate 中设置 BindingContext 的尝试。
    删除此 xaml:
<!-- Delete this -->
<views:CourseCard.BindingContext>
    <vm:CourseCardViewModel>
       <vm:CourseCardViewModel.Course>
            <Binding Path="." />                                    
       </vm:CourseCardViewModel.Course>
    </vm:CourseCardViewModel>
</views:CourseCard.BindingContext>
  • CourseCard 应在其构造函数中执行
    BindingContext = new CourseCardViewModel();
    (在 InitializeComponent() 之后),或在其 XAML 中执行等效操作(未显示)。
    例如:
public CourseCard()
{
    InitializeComponent();
    BindingContext = new CourseCardViewModel();
}

或者如果 vm 是构造函数的参数,

public CourseCard(CourseCardViewModel ccvm)
,然后
BindingContext = ccvm;
.

© www.soinside.com 2019 - 2024. All rights reserved.