📅  最后修改于: 2023-12-03 14:44:26.294000             🧑  作者: Mango
在这篇文章中,我们将介绍如何使用MVVM模式创建第一个应用程序。该应用程序使用Xamarin.Forms构建,可以在Android,iOS和UWP(通用Windows平台)设备上运行。
MVVM是一个设计模式,它将应用程序的用户界面分解成三个主要部分:模型,视图和视图模型。其中,
MVVM的目的是为了促进代码分离,提高可重用性和可测试性。
我们将创建一个简单的Todo List应用程序,用户可以添加和管理待办事项。主要功能包括:
我们将使用Xamarin.Forms建立应用程序,并使用基本的数据绑定技术实现MVVM模式。在这开始之前,确保已安装Visual Studio 2019并安装了Xamarin和相关组件。现在,让我们开始这个项目!
首先,我们需要创建一个空的Xamarin.Forms项目。在Visual Studio中,单击“文件”>“新建”>“项目”,然后在“新建项目”对话框中选择“移动应用程序”>“移动应用程序(Xamarin.Forms)”。在弹出窗口中,输入 “TodoList”作为应用程序名称,选择平台(Android,iOS,UWP)并点击“创建”按钮。
现在,我们将在TodoList项目中添加两个新的文件夹:“Models”和“ViewModels”,分别用于存放数据模型和视图模型。
我们需要一个名为Task的模型类,它将要做的一切事情都包含在内。模型类应至少包括以下属性:
在“Models”文件夹中添加一个新的C#文件Task.cs。将模型类Task声明如下:
public class Task {
public Guid Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
}
现在,我们将创建一个名为TaskViewModel的视图模型类,该类包含有关待办事项的所有信息。我们需要在视图模型中添加以下属性:
在“ViewModels”文件夹中添加一个新的C#文件TaskViewModel.cs。将视图模型类TaskViewModel声明如下:
public class TaskViewModel : INotifyPropertyChanged {
public ObservableCollection<Task> Tasks { get; set; }
public string[] NewTask { get; set; }
public ICommand AddTaskCommand { get; set; }
public ICommand DeleteTaskCommand { get; set; }
public ICommand TaskCompletedCommand { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
/* 构造函数中初始化属性的默认值 */
public TaskViewModel() {
Tasks = new ObservableCollection<Task>();
AddTaskCommand = new Command(() => AddTask());
DeleteTaskCommand = new Command((id) => DeleteTask(id));
TaskCompletedCommand = new Command((id) => TaskCompleted(id));
}
/* 添加新任务的方法 */
private void AddTask() {
var task = new Task() {
Id = Guid.NewGuid(),
Title = NewTask[0],
Description = NewTask[1]
};
Tasks.Add(task);
NewTask = new string[2]; //清空表单
OnPropertyChanged(nameof(NewTask));
}
/* 删除完成的任务的方法 */
private void DeleteTask(object id) {
var taskToRemove = Tasks.SingleOrDefault(task => task.Id == (Guid)id);
if (taskToRemove != null) {
Tasks.Remove(taskToRemove);
}
}
/* 标记已完成的任务的方法 */
private void TaskCompleted(object id) {
var taskToUpdate = Tasks.SingleOrDefault(task => task.Id == (Guid)id);
if (taskToUpdate != null) {
taskToUpdate.Description = "COMPLETED";
}
}
/* INotifyPropertyChanged实现 */
protected virtual void OnPropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
现在,我们拥有应用程序模型和视图模型的架构,该架构支持我们的应用程序所需的所有逻辑。接下来,我们将组建视图并绑定这些视图到视图模型。
现在,我们将构建一个包含Todo List的简单页面。在“Views”文件夹中添加一个新的XAML页面TodoListPage.xaml,编写如下XAML代码:
<ContentPage x:Class="TodoList.Views.TodoListPage"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Name="TodoListPage"
Title="Todo List">
<StackLayout Orientation="Vertical" Spacing="10">
<StackLayout Orientation="Horizontal" Spacing="10">
<Entry Text="{Binding NewTask[0]}" Placeholder="Title" HorizontalOptions="FillAndExpand" />
<Entry Text="{Binding NewTask[1]}" Placeholder="Description" HorizontalOptions="FillAndExpand" />
<Button Text="Add" Command="{Binding AddTaskCommand}" HorizontalOptions="Start" />
</StackLayout>
<ListView ItemsSource="{Binding Tasks}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="80" />
</Grid.ColumnDefinitions>
<StackLayout>
<Label Text="{Binding Title}" Style="{DynamicResource ListItemTextStyle}" />
<Label Text="{Binding Description}" Style="{DynamicResource ListItemDetailTextStyle}" />
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Center">
<Button Text="Done" Command="{Binding Source={x:Reference TodoListPage}, Path=BindingContext.TaskCompletedCommand}" CommandParameter="{Binding Id}" />
<Button Text="Delete" Command="{Binding Source={x:Reference TodoListPage}, Path=BindingContext.DeleteTaskCommand}" CommandParameter="{Binding Id}" />
</StackLayout>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
该页面包括:
我们已经定义了应用程序页面的UI,接下来,我们将在代码中绑定视图到视图模型。打开TodoListPage.xaml.cs,并在构造函数中添加以下代码:
BindingContext = new TaskViewModel();
现在,应用程序页面已完全连接到视图模型,这意味着页面中的控件现在已与视图模型属性绑定。我们已经创建了一个MVVM模式应用程序!最后,我们将在不同平台上测试应用程序。
构建和运行应用程序后,您可以使用以下操作测试它:
恭喜!现在你已经了解了如何使用MVVM模式构建Xamarin.Forms应用程序的基础知识。结合上述步骤,您可以通过模型,视图和视图模型进行代码分离,提高应用程序的可重用性和可测试性,进一步优化您的开发体验!