C# 在Xamarin.Forms项目中实现MVVM

C# 在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

我一直在玩Xamarin.Forms,我做了一个简单的“Hello World”类型的项目。我一直在尝试将同一个项目转换为MVVM类型的项目,只是为了了解情况。然而,我很难决定我的模型应该是什么。以下是到目前为止我的项目的外观:

视图/MainView.xaml

<?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

    }
}