在 .NET MAUI 中进行课程注册和编辑的共享 XAML/ViewModel 方法

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

我正在开发具有 MVVM 结构的 .NET MAUI。我有一个显示课程列表的主页。单击课程时,我将课程对象从 startpage.cs 传递到我的 CourseDetailsViewModel。

现在,我有另一个选项卡,一个注册页面,用于创建新课程。本质上,用于注册和编辑的 XAML 和 ViewModel 是相同的(相同的逻辑)。唯一的区别是,在用于编辑课程的 ViewModel 中,我收到一个用于数据绑定的课程对象来编辑属性,而对于注册,我直接绑定到课程的属性。我可以创建共享的 XAML/ViewModel 来进行注册和编辑吗?希望有一个关于如何解决这个问题的代码示例。

startpage.cs:

private async void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e)
{
    var course = ((VisualElement)sender).BindingContext as Course;
    if (course == null) return;

    await Shell.Current.GoToAsync(nameof(CourseDetailsPage), true, new Dictionary<string, object>
    {{"Course", course}});
}

我的 ViewModel 用于使用传递的属性进行编辑:

[QueryProperty("Course", nameof(Course))]
public partial class CourseDetailsViewModel : BaseViewModel
{
    [ObservableProperty]
    private Course _course;
}

Details.xaml 具有带有属性的 Course 对象:

  <DatePicker x:Name="datePicker"
              Date="{Binding Course.DateTime}" />

我的注册 ViewModel 包含课程的属性:

 public partial class TripRegistrationViewModel : BaseViewModel
 {
     [ObservableProperty]
     private DateTime _dateTime = DateTime.Now;

     [ObservableProperty]
     private string _name;   

Registration.xaml 具有 Course 的属性:

  <DatePicker x:Name="datePicker"
              Date="{Binding DateTime}" />
mvvm maui maui-community-toolkit community-toolkit-mvvm
1个回答
0
投票

您可以通过创建包含所有课程控件的[ContentView]来实现这一点, 所以你可以在任何地方使用它。

注释:

  • 不要在[ContentView]中设置

    BindingContext
    ,而是使用
    x:DataType="ViewModel:VM_ContentView_Course"
    ,您会将其绑定到父页面或选项卡[注册或编辑]例如:

    <Views:ContentView_Course BindingContext="{Binding VM_Course}"/>
    
© www.soinside.com 2019 - 2024. All rights reserved.