C# 在Xamarin.Forms项目中实现MVVM
我一直在玩Xamarin.Forms,我做了一个简单的“Hello World”类型的项目。我一直在尝试将同一个项目转换为MVVM类型的项目,只是为了了解情况。然而,我很难决定我的模型应该是什么。以下是到目前为止我的项目的外观: 视图/MainView.xamlC# 在Xamarin.Forms项目中实现MVVM,c#,mvvm,xamarin,xamarin.forms,C#,Mvvm,Xamarin,Xamarin.forms,我一直在玩Xamarin.Forms,我做了一个简单的“Hello World”类型的项目。我一直在尝试将同一个项目转换为MVVM类型的项目,只是为了了解情况。然而,我很难决定我的模型应该是什么。以下是到目前为止我的项目的外观: 视图/MainView.xaml <?xml version="1.0" encoding="UTF-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" x
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestGround.MainView">
<ContentPage.Content>
<StackLayout VerticalOptions="Center">
<Label
Text="{Binding Greeting}"
VerticalOptions="Center"
HorizontalOptions="Center"
/>
<Entry
Text="{Binding Name}"
/>
<Button
Text="Enter"
Command="{Binding SayHelloCommand}"
/>
</StackLayout>
</ContentPage.Content>
</ContentPage>
ViewModels/MainViewModel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
namespace TestGround
{
public class MainViewModel :INotifyPropertyChanged
{
private string _greeting; //backing field for Greeting
public string Greeting //implementation for Greeting method
{
get { return _greeting; }
set
{
_greeting = value;
OnPropertyChanged ("Greeting"); //Notify view that change has taken place
}
}
public string Name { get; set; } //Name method for Entry field, completely useless
public ICommand SayHelloCommand { get; set; } //ICommand binds to buttons in XAML
public void SayHello() //Need a regular method to add to ICommand
{
Greeting = "Hello " + Name;
}
public MainViewModel ()
{
Greeting = "Its alive!";
Name = "Enter name";
SayHelloCommand = new Command(SayHello); //Regular command added to ICommand
}
#region PropertyChangedRegion
public void OnPropertyChanged (string propertyName)
{
if (PropertyChanged != null)
PropertyChanged (this, new PropertyChangedEventArgs (propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
我有一个空的Models文件夹,我对MVVM结构了解不够,无法决定我的模型应该是什么。我想我应该在模型中声明我的方法并在ViewModel中实现它们,但我不确定
有人能告诉我代码的哪些部分是模型吗?在您发布的示例中,模型是您正在设置的字符串
问候语和姓名。如果您的示例变得更高级,您可能会得到一个带有名称属性的Person
模型对象,该属性来自一些外部源,如数据库或web服务
视图模型将负责检索Person
模型对象,可能是GetPerson
(),并设置Name=Person.Name
表单移动CRM示例和
“因此,任何以任何方式与视图交互的内容都将进入
ViewModel?这样我就可以在我的
模型,并在ViewModel中初始化它们以显示在
视图?”
通常,在某些情况下,您可能只关注视图,而不需要与视图模型交互。设想视图模型具有视图的无头表示。如果您有一个用于登录的视图模型,它可能有用户名
,密码
属性,以及一个用于登录的登录
方法。当用户单击登录
按钮时,视图模型将验证用户名
和密码
,然后根据某些服务对用户进行身份验证。此时,可以绑定视图以允许用户登录。还可以编写一个测试,使用相同的视图模型测试登录过程 那么,我会在模型中声明支持字段吗?然后在我的ViewModel中实现问候方法?同样,基本上我的模型将包含类,我的ViewModel将包含上述类的对象?通常是的,模型是视图模型要显示或处理的某些状态或数据的表示。视图模型是位于视图和模型之间的东西。它是视图和数据之间的交通警察。视图模型具有问候属性,但如果有意义的话,模型也可以具有问候属性。因此,任何以任何方式与视图交互的内容都将进入视图模型?所以我可以将问候语和姓名属性放在我的模型中,并在ViewModel中初始化它们以显示在视图中?
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
namespace TestGround
{
public class MainViewModel :INotifyPropertyChanged
{
private string _greeting; //backing field for Greeting
public string Greeting //implementation for Greeting method
{
get { return _greeting; }
set
{
_greeting = value;
OnPropertyChanged ("Greeting"); //Notify view that change has taken place
}
}
public string Name { get; set; } //Name method for Entry field, completely useless
public ICommand SayHelloCommand { get; set; } //ICommand binds to buttons in XAML
public void SayHello() //Need a regular method to add to ICommand
{
Greeting = "Hello " + Name;
}
public MainViewModel ()
{
Greeting = "Its alive!";
Name = "Enter name";
SayHelloCommand = new Command(SayHello); //Regular command added to ICommand
}
#region PropertyChangedRegion
public void OnPropertyChanged (string propertyName)
{
if (PropertyChanged != null)
PropertyChanged (this, new PropertyChangedEventArgs (propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}