在MonoDroid / MonoTouch中使用ViewModels

时间:2011-11-15 08:12:44

标签: mvvm mono xamarin.ios xamarin.android

我决定在MonoDroid和MonoTouch中稍微涉足一下,并将我的一个WP7应用程序作为入门者。我真的想重用我现有的ViewModels,但由于Android和iOS似乎都没有XAML强大的数据绑定,我想问一下之前是否有人走过这条路线,可以推荐一些最佳实践或现有解决方案。

2 个答案:

答案 0 :(得分:5)

我们现在正在使用应用程序执行此操作,但首先为iOS编写(甚至在Windows之前)。它肯定没有充满彩虹和小马。

我会推荐以下内容:

  • 在Windows上使用MVVM框架,不要求您在用户执行的每个操作上公开ICommand(例如Caliburn),它也不应该要求所有操作都依赖于它。你的ViewModels。
  • 有条件地继承ViewModelBase类的WPF特定部分,可以使用部分类或#if iPhone指令执行此操作。 INotifyPropertyChanged或ICommand就是例子。
  • 使用IoC容器,将诸如保存设置保存到文件系统之类的内容非常有用,这在所有平台上都是非常不同的。还有助于整理您的依赖项,这对于将特定于平台的代码与特定于非平台的代码分离非常有用。
  • 使用某种类型的“信使”(example here),通常包含在MVVM框架中。在我看来,这是必须,至少对于iOS而言。 Apple的MVC如此遍布全球,最好能够以弱引用(和解耦)方式订阅全局消息。
  • 像在本地一样在每个平台上使用MVC,然后像对待手动调用时一样对待每个ViewModel。没有UI绑定,没有ICommand,因此请保持ViewModel的简单。
  • 链接文件是有史以来最好的技巧。您不希望每个平台都有每个视图模型的副本,因此请确保您知道如何链接到Visual Studio和MonoDevelop中项目中的文件。这也使#if iPhone#if Android语句成为可能。

我知道你正在使用现有的应用程序,所以很难。重用您的业务模型可能更简单,就是这样。 Android和iOS都有自己的MVC模式,与WPF截然不同。您可能还需要移动设备上每个ViewModel的子集,这样可以更容易地重写。

在我们的案例中:

  • 我们正在使用TinyIoC(也有自己的信使)
  • 当我们开始使用WPF时,我们将使用Caliburn-Micro,我们不需要完整Caliburn中的某些功能

答案 1 :(得分:3)

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

作为其中的一部分,我们发布了我们自己的mvvm框架 - 包括对touch和droid的一些数据绑定支持 - 来源可在http://github.com/slodge/mvvmcross获得

移植到droid的经验很好 - axml布局文件为数据绑定提供了一个很好的钩子。然而,目前我对触摸实现的绑定并不满意 - 尽管montouch.dialog有时至少为我们提供了一些漂亮的代码。