Mvvm 在MonoDroid/MonoTouch中使用ViewModels

Mvvm 在MonoDroid/MonoTouch中使用ViewModels,mvvm,mono,xamarin.ios,xamarin.android,Mvvm,Mono,Xamarin.ios,Xamarin.android,我决定涉猎一下MonoDroid和MonoTouch,并将我的一个WP7应用作为入门。我真的很想重用我现有的ViewModels,但由于Android和iOS似乎都没有XAML强大的数据绑定功能,我想问一下,以前是否有人这样做过,是否可以推荐一些最佳做法或现有的解决方案。我们现在正在使用一个应用程序,但首先要为iOS编写(甚至在窗户前)。这里肯定没有彩虹和小马 我建议如下: 在Windows上使用MVVM框架,该框架不需要在用户执行的每个操作中公开ICommand(例如),也不需要在所有Vie

我决定涉猎一下MonoDroid和MonoTouch,并将我的一个WP7应用作为入门。我真的很想重用我现有的ViewModels,但由于Android和iOS似乎都没有XAML强大的数据绑定功能,我想问一下,以前是否有人这样做过,是否可以推荐一些最佳做法或现有的解决方案。

我们现在正在使用一个应用程序,但首先要为iOS编写(甚至在窗户前)。这里肯定没有彩虹和小马

我建议如下:

  • 在Windows上使用MVVM框架,该框架不需要在用户执行的每个操作中公开ICommand(例如),也不需要在所有ViewModel中对其进行依赖
  • 有条件地继承ViewModelBase类中特定于WPF的部分,您可以使用分部类或
    #如果iPhone
    指令来实现这一点。INotifyPropertyChanged或ICommand就是示例
  • 使用IoC容器,将设置保存到文件系统等内容抽象出来是非常有帮助的,这在所有平台上都会非常不同。还可以帮助整理依赖关系,这对于区分平台特定代码和非平台特定代码非常有帮助
  • 使用某种类型的“messenger()”,通常包括在MVVM框架中。我认为这是一个必须的,至少对于iOS来说是这样。苹果的MVC无处不在,最好以弱引用(和解耦)的方式订阅全局消息
  • 在每个平台上使用MVC就像在本地使用一样,然后像手动调用一样对待每个ViewModel。没有UI绑定,没有ICommand,所以保持ViewModel的简单
  • 链接文件是有史以来最好的技巧。您不希望每个平台都有一个视图模型的副本,因此请确保您知道如何链接到Visual Studio和MonoDevelop中的项目中的文件。这也使得
    #如果iPhone
    #如果Android
    语句成为可能
我知道您使用的是现有的应用程序,所以这很难。重用您的业务模型可能更简单,仅此而已。Android和iOS有自己的MVC模式,与WPF有很大的不同。在移动设备上,您可能只需要每个ViewModel的一个子集,这样就更容易重写

就我们而言:

  • 我们正在使用(还有它自己的messenger)
  • 当我们开始使用WPF时,我们不需要完全Caliburn中的某些功能

我最近完成了一个大型项目,我们首先编写了wp7,然后将其移植到touch和droid中

作为这项工作的一部分,我们发布了自己的mvvm框架——包括对touch和droid的一些数据绑定支持——源代码可在


移植到droid的体验很好——axml布局文件为数据绑定提供了一个很好的挂钩。然而,目前,我对我们为touch实现的绑定不太满意——尽管montouch.dialog有时确实为我们提供了一些好看的代码。

谢谢你富有洞察力的回答Jonathan。有一个问题。你问了吗你在某个时候尝试通过订阅视图中的PropertyChanged来利用INotifyPropertyChanged,并模拟单向绑定?我使用TinyIoC的messenger来更新视图。当你进入iOS时,你会明白为什么。有时你必须对3个或更多类进行子类化才能使复杂的视图正常工作,这是一件痛苦的事情将您的ViewModel传递到所有其他对象并连接事件。messenger只是完成相同任务的一种很好的分离方式。我假设messenger的意思与EventAggregator模式类似或等同,我在项目中经常使用该模式,通过中央控制器和e关于多个虚拟机的通风口。是的,没错。还有其他名称。它在Caliburn中是IEventAggregator,但我们使用TinyIoC的TinyMessenger b/c。我们需要iPhone上的功能,而不需要Caliburn。您关于链接到项目中的源文件(而不是添加它们)的声明非常宝贵。我有一个.NET/Mono天文学库,它在两组解决方案和项目之间共享其所有C#源代码;一组用于Visual Studio,另一组用于MonoDevelop。好的建议!干杯!