MvvmCross

说起MvvmCross,要先说到MvvmMvvm是Mvc框架的一种变形。对应的分别为Model、View和ViewModel层。三层之间的关系是这样的:

Model层为数据层,实现了业务数据的定义,View层为表现层,ViewModel层隔离了数据层和表现层,实现了对业务数据的隔离以及和表现层数据的绑定。

创建解决方案

1. 先要创建一个Xamarin跨平台的解决方案。方案模板使用Blank Xaml App(Xamarin.Forms Protable)

2. 创建好的解决方案大体应该是这样子,包含一个可移植的项目、一个Android的项目和一个iOS的项目。如果有其它的项目,我们暂时移除掉。

3. 添加MvvmCross引用。引用MvvmCross需要从Nuget中添加。

在解决方案上点击右键,选择 管理解决方案NuGet程序包 这一项。

4. 在NuGet管理器中直接搜索 MvvmCross,搜索结果第一项就是MvvmCross

在右边的解决方案栏中选择要引用MvvmCross的项目,点击安装,Nuget管理器自动下载MvvmCross并添加引用。

安装完成后,查看解决方案,我们会发现项目已经引用了MvvmCross相应的程序集。

可移植项目

可移植项目做为解决方案共享的项目,主要建立所有项目公用的内容。这里我们主要建立公共类库以及ViewModel。

1. 首先将项目中的App.xaml和mainPage.xaml移除。

2. 新建一个ViewModels文件夹,保存公共的ViewModel。

3. 在ViewModels下新建MainViewModel.cs。

4. 新建App类,做为MvvmCross公共的应用程序入口。

整理后项目结构大体是这样的

  • App.cs
using Acr.UserDialogs;
using MvvmCross.Core.ViewModels;
using MvvmCross.Platform;
using MvvmCross.Platform.IoC;
using XamarinSample.ViewModels; namespace XamarinSample
{
public class App : MvxApplication
{
public override void Initialize()
{
base.Initialize(); // 注册所有的服务类
CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();
Mvx.RegisterSingleton(UserDialogs.Instance);
RegisterAppStart<MainViewModel>();
}
}
}
  • MainViewModel.cs
using System.Windows.Input;
using MvvmCross.Core.ViewModels; namespace XamarinSample.ViewModels
{
public class MainViewModel : MvxViewModel
{
/// <summary>
/// 获取或设置标题
/// 设置标题时将触发属性改变事件
/// </summary>
public string Title
{
get { return _title; }
set
{
_title = value;
RaisePropertyChanged(() => _title);
}
} private ICommand _showTitleCommand;
private string _title; /// <summary>
/// 获取 显示标题的Command
/// </summary>
public ICommand ShowTitleCommand
{
get { return _showTitleCommand ?? (_showTitleCommand = new MvxCommand(ShowTitle)); }
} private void ShowTitle()
{
Acr.UserDialogs.UserDialogs.Instance.Alert(Title,"这是一个标题", "知道了");
}
}
}

通过以上步骤,可移植项目已经整理完成了,下面我们针对各个移动端项目分别实现调用。

Android项目

Android项目主要实现Android界面以及界面逻辑。我们分别创建界面布局、与ViewModel绑定以及实现界面逻辑。

1. 添加MvvmCross 在Android项目的Setup类。

2. 添加界面布局并绑定ViewModel数据。

3. 实现入口Activity,绑定布局。

  • Setup.cs
using Android.Content;
using MvvmCross.Core.ViewModels;
using MvvmCross.Droid.Platform; namespace XamarinSample.Droid
{
public class Setup : MvxAndroidSetup
{
public Setup(Context applicationContext) : base(applicationContext)
{
} protected override IMvxApplication CreateApp()
{
return new App();
}
}
}
  • MainPage.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="50"
android:id="@+id/textView2"
android:singleLine="true"
android:gravity="center_vertical"
local:MvxBind="Text Title, Mode=TwoWay"
android:hint="请输入标题"
android:inputType="text"
android:layout_marginTop="100"
android:layout_marginBottom="20"
android:textSize="26dip"
android:background="@color/design_fab_stroke_end_outer_color" />
<Button
android:text="显示标题"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button1"
local:MvxBind="Click ShowTitleCommand"
android:textSize="30dip" />
</LinearLayout>

  • MainActivity.cs
using Android.App;
using Android.Content.PM;
using Android.OS;
using MvvmCross.Droid.Views;
using XamarinSample.ViewModels; namespace XamarinSample.Droid
{
[Activity(Label = "XamarinSample", Icon = "@drawable/icon",
Theme = "@style/MainTheme",
MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : MvxActivity<MainViewModel>
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.MainPage);
}
}
}

OK, 至此Android端的项目完成了,让我们执行一下看看效果

iOS项目

iOS 项目也主要实现了iOS上的界面逻辑,但如果要完成iOS的界面设计,需要连接到Mac系统才能在VS中进行界面设计。

  • 添加iOS项目的Setup对象。

Setup.cs

using MvvmCross.Core.ViewModels;
using MvvmCross.iOS.Platform;
using MvvmCross.iOS.Views.Presenters;
using UIKit; namespace XamarinSample.iOS
{
public class Setup : MvxIosSetup
{ protected override IMvxApplication CreateApp()
{
return new App();
} public Setup(IMvxApplicationDelegate applicationDelegate, UIWindow window) : base(applicationDelegate, window)
{
} public Setup(IMvxApplicationDelegate applicationDelegate, IMvxIosViewPresenter presenter) : base(applicationDelegate, presenter)
{
}
}
}
  • 在修改 AppDelegate.cs 文件,对象继承于  ,修改FindishedLaunching方法。
using Foundation;
using MvvmCross.Core.ViewModels;
using MvvmCross.iOS.Platform;
using MvvmCross.Platform;
using UIKit; namespace XamarinSample.iOS
{
[Register("AppDelegate")]
public class AppDelegate : MvxApplicationDelegate
{
public override UIWindow Window { get; set; } public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Window = new UIWindow(UIScreen.MainScreen.Bounds); var setup = new Setup(this, Window);
setup.Initialize(); var startup = Mvx.Resolve<IMvxAppStart>();
startup.Start(); Window.MakeKeyAndVisible(); return true;
}
}
}
  • 新建Views文件夹,并在文件夹下添加界面文件MainView。

  • 打开MainView.xib界面文件,进行界面设计。

我们在界面上添加一个TextField和一个Button,分别命名为txtField和btnShow。

  • 修改MainView.cs对象,实现数据绑定。
using MvvmCross.Binding.BindingContext;
using MvvmCross.iOS.Views;
using UIKit;
using XamarinSample.ViewModels; namespace XamarinSample.iOS.Views
{
public partial class MainView : MvxViewController<MainViewModel>
{
public MainView() : base("MainView", null)
{
} public override void DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning(); // Release any cached data, images, etc that aren‘t in use.
} public override void ViewDidLoad()
{
base.ViewDidLoad(); var set = this.CreateBindingSet<MainView, MainViewModel>(); set.Bind(txtTitle).To(vm => vm.Title); set.Bind(btnShow).To(x => x.ShowTitleCommand);
set.Apply(); // Perform any additional setup after loading the view, typically from a nib.
} }
}

好了,iOS的项目也设计完成了,我们运行一下看看效果。

Xamarin + MvvmCross 简单事例 Part 2的更多相关文章

  1. ogre3d环境配置 SDK安装配置及简单事例教程

    ogre3d环境配置 SDK安装配置及简单事例教程 http://www.cr173.com/html/22594_1.html ogre3d环境配置 SDK安装配置及简单事例教程 http://ww ...

  2. Xamarin + MvvmCross 安装 Part 1

    前言 最近,由于工作需要,公司准备开发移动端APP.临近年底,公司不准备大面招人,由于公司一直基于.net平台进行开发,本人自告奋勇,准备先用xamarin做下移动开发.开始了在网上不停的google ...

  3. c#创建、安装、卸载、调试windows服务的简单事例

    最近工作中用到了windows服务,对其有深刻理解和丰富经验谈不上,本篇文章只是简单陈诉用c#创建.安装.卸载.调试windows服务的步骤. 一.创建windows服务 1.用VS创建windows ...

  4. 拖动div简单事例代码

    事例文件下载 //拖动容器代码 var rDrag = { o: null, init: function (o) { o.onmousedown = this.start; }, start: fu ...

  5. springMVC 简单事例

    本帖最后由 悲观主义者一枚 于 2015-1-31 17:55 编辑 使用SpringMvc开发Android WebService入门教程1.首先大家先创建一个JavaWeb项目2.然后加入Spri ...

  6. C# Asp.net Quartz.NET作业调度之创建、安装、卸载、调试windows服务的简单事例

    一.创建windows服务 1.用VS创建windows服务,结果如下: 2.删除默认生成的Service1.cs文件,然后创建自己的服务文件(如:MyService),并修改Program.cs文件 ...

  7. Django安装与简单事例-02

    Django的下载与基本命令 1.下载Django: 1 pip3 install django 2.创建一个django project 1 django-admin.py startproject ...

  8. django1.4 简单事例 ,根目录下templates

    django发展很快,但是有的是用的老版本,比如我现在看到一个项目,它用的是 Django1.4,而且app不是创建在了项目的根目录下,这样,它的Setting中设置就会不一样,若是设置错误,就会找不 ...

  9. freemark简单事例

    工作准备:开发环境myeclipse freemarker.jar(需要下载) 首先引入freemarker.jar包.然后,,,,直接贴代码: 1.创建一个FreemarkerUtil类: pack ...

随机推荐

  1. matlab中fix函数,floor函数,ceil函数

    1)fix(n)的意义是取小于n的整数(是向零点舍入的意思是往零的方向上靠),这是一类应用在整数取值上的函数,就如同以前我们所研究的求整问题,例如,fix(pi)=3;fix(3.5)=3;fix(- ...

  2. Python通过pip方式安装第三方模块的两种方式

    一:环境 python3.6 windows 10 二:常用命令 如果直接执行pip命令报错,说明pip不在path环境变量中 解决方法: python -m pip list 以下默认可直接使用pi ...

  3. Java消息中间件入门笔记 - ActiveMQ篇

    入门 消息中间件带来的好处: 1)解耦:系统解耦 2)异步:异步执行 3)横向扩展 4)安全可靠 5)顺序保证 栗子: 通过服务调用让其它系统感知事件发生 系统之间高耦合 程序执行效率低 通过消息中间 ...

  4. 教你使用HTML5原生对话框元素,轻松创建模态框组件

    HTML 5.2草案加入了新的dialog元素.但是是一种实验技术. 以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找 ...

  5. 【Java面试宝典】深入理解JAVA虚拟机

    一.运行时数据区域 线程隔离:线程隔离的意思,就是给不同的线程多分配的资源用,以做到不争用. 线程共享:线程共享就是资源只有一个没有办法分配更多,只能共享. Java虚拟机管理的内存包括几个运行时数据 ...

  6. 追源索骥:透过源码看懂Flink核心框架的执行流程

    li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...

  7. Python-0010-

    题目: 判断101-200之间有多少素数,并输出所有素数. 程序分析: 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除则表明次数不是素数,反之是素数.用else 可以进一步简化代 ...

  8. hibernate多对多 一对多 及简单入门 主键生成策略

    Hibernate简单使用 入门 通过hibernate的 一对多 多对多轻松看懂hibernate配置 (不使用注解) hibernate对jdbc访问数据库的代码进行轻量级封装,简化重复代码 减少 ...

  9. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

     varchar与char的区别: 1).varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长 ...

  10. 福州大学软件工程1816 | W班 第4次作业(团队展示)成绩排名

    作业链接 评分细则 队员姓名与学号(标记组长),其中4-7人一组,特殊情况经老师允许后可以突破限制:(1分) 队名(体现项目内容,并要求有亮点与个性):(1分) 拟作的团队项目描述:一句话(中英文不限 ...