在MonoDroid / MonoTouch中使用ViewModels

9

我决定尝试一下MonoDroid和MonoTouch,并将我的WP7应用程序作为起点进行移植。我非常希望能够重用现有的ViewModels,但由于Android和iOS似乎没有像XAML那样强大的数据绑定,因此我想问一下是否有人走过这条路,并能推荐一些最佳实践或现有解决方案。

2个回答

5

我现在正在使用一个应用程序进行这项工作,但首先要为iOS编写(甚至比Windows更早)。毫无疑问,这并不是充满彩虹和小马的。

我建议以下操作:

  • 在Windows上使用一个MVVM框架,不需要你在每个用户操作上都暴露ICommand(例如像Caliburn这样的框架),同时它也不应该要求在所有ViewModel中都依赖它。
  • 有条件地继承ViewModelBase类的特定于WPF的部分,可以使用偏类或#if iPhone指令来实现。其中,INotifyPropertyChanged或ICommand是例子。
  • 使用IoC容器,将诸如保存设置到文件系统等抽象出来非常有帮助,因为这在所有平台上都会有所不同。此外,它还有助于解决您的依赖关系,有助于将特定于平台的代码与非特定于平台的代码分离开来。
  • 使用某种"messenger"(例如这里的示例),通常与MVVM框架一起提供。我认为这是必须的,至少对于iOS而言。苹果的MVC是如此混乱,最好有全局消息可以以弱引用(和解耦合的方式)订阅。
  • 在每个平台上像本地那样使用MVC,然后像手动调用一样处理每个ViewModel。其中没有UI绑定,没有ICommand,因此保持ViewModel简单。
  • 链接文件是最好的技巧。您不想为每个平台都复制一份ViewModel,因此请确保您知道如何在Visual Studio和MonoDevelop的项目中链接到文件。这还使得#if iPhone#if Android语句成为可能。
I know you are working with an existing application, so it's tough. It may be simpler to just reuse your business model and that's it. Android and iOS have MVC patterns of their own, and are drastically different from WPF. You might also only need a subset of each ViewModel on mobile devices, which could make it easier to just rewrite.
In our case:
我们使用TinyIoC(也有自己的messenger)
当我们开始使用WPF时,我们将使用Caliburn-Micro,我们不需要完整的Caliburn中的一些功能。

感谢你深刻的回答,Jonathan。我有一个问题。您是否尝试过通过订阅视图中的PropertyChanged事件并模拟单向绑定来利用INotifyPropertyChanged? - Oliver Weichhold
我使用了TinyIoC的Messenger来更新View。当你开始学习iOS时,你会明白为什么要这样做。有时候,你需要继承3个或更多的类来使复杂的View正常工作,而且将ViewModel传递给所有这些对象并连接事件是一件很麻烦的事情。Messenger只是一种不错的解耦方式,可以完成同样的任务。 - jonathanpeppers
我假设您所说的“信使”指的是类似于EventAggregator模式或者是相同的东西。在我的项目中,我已经广泛使用该模式来实现通过中央控制器进行松散耦合导航和涉及多个VM的事件。 - Oliver Weichhold
是的,没错。它还有其他的名称。在Caliburn中它被称为IEventAggregator,但我们使用了TinyIoC的TinyMessenger,因为我们需要在iPhone上使用该功能,而不需要引用Caliburn。 - jonathanpeppers
你关于在项目中链接源文件(而不是添加它们)的说法非常宝贵。我有一个.NET/Mono天文库,它在两套解决方案和项目之间共享所有的C#源代码;一套用于Visual Studio,另一套用于MonoDevelop。明智的建议!干杯! - NovaJoe

3

我最近完成了一个大型项目,我们先写了wp7版本,然后移植到了触摸屏和Android上。

作为其中的一部分,我们发布了自己的mvvm框架,包括一些用于触摸屏和Android的数据绑定支持。源代码可在http://github.com/slodge/mvvmcross找到。

将项目移植到Android的经验很好,axml布局文件为数据绑定提供了良好的钩子。然而,目前我对触摸屏所实现的绑定并不完全满意,尽管montouch.dialog有时提供给我们一些看起来不错的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接