我正在开发具有 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}" />
您可以通过创建包含所有课程控件的[ContentView]来实现这一点, 所以你可以在任何地方使用它。
注释:
不要在[ContentView]中设置
BindingContext
,而是使用x:DataType="ViewModel:VM_ContentView_Course"
,您会将其绑定到父页面或选项卡[注册或编辑]例如:
<Views:ContentView_Course BindingContext="{Binding VM_Course}"/>