Xamarin.Forms的MVVM框架

Xamarin.Forms的MVVM框架,mvvm,xamarin.forms,Mvvm,Xamarin.forms,有人能解释一下,像ReactiveUI或MVVM Light这样的MVVM框架对Xamarin.Forms应用程序有什么好处吗?我们可以在viewmodels中实现INotifyPropertyChanged,而无需使用任何这些框架。 我错过什么了吗 MVVM框架不仅仅是INotifyPropertyChanged。仅举几个例子: RelayCommand-一个类,可以提供ICommand接口的实现,并允许您将委托绑定到视图。用于按钮 EventToCommand-这允许您将事件绑定到视图模型

有人能解释一下,像ReactiveUI或MVVM Light这样的MVVM框架对Xamarin.Forms应用程序有什么好处吗?我们可以在viewmodels中实现INotifyPropertyChanged,而无需使用任何这些框架。
我错过什么了吗

MVVM框架不仅仅是
INotifyPropertyChanged
。仅举几个例子:

  • RelayCommand-一个类,可以提供
    ICommand
    接口的实现,并允许您将委托绑定到视图。用于按钮
  • EventToCommand-这允许您将事件绑定到视图模型中的命令。而不必为
    ui元素事件使用代码隐藏
这只是MVVM框架提供的两个类,例如
MVVMLight

通过使用MVVMLight,您不必在每个项目中实现
INotifyPropertyChanged
,只需确保您的
ViewModel
继承自
ViewModelBase
,并且您也不必在每个项目中为上述两个类编写自己的实现

最后要提到的是,您还可以为
MVVMLight
安装代码片段。这意味着编写代码更快


例如,如果您想更改引发属性的属性,只需使用mvvmlight属性片段。同样,如果您想要
RelayCommand
属性,您可以使用
mvvmlight RelayCommand
snippet

我是Xamarin.Forms()的小型MVVM框架的作者。我将尝试指出使用它的一些优点,因为其他框架也有一些常见的功能:

  • 可以使用的
    INotifyPropertyChanged
    实现(仅从
    BaseViewModel
    BaseModel
    继承)
  • 面向视图模型的导航(您可以将导航逻辑移动到视图模型)
  • 内置消息传递,可在页面或视图模型之间轻松传递数据/参数
  • 页面缓存和重用(随着视图/页面的重用,用户界面体验会更好)
  • 每个页面都可以访问类型化的ViewModel实例,该实例将自动实例化并连接到BindingContext
这些特性因库而异。一些更高级的MVVM框架为您提供了将整个项目移动到不同平台/SDK的可能性,因为它们支持多平台。对于大型项目来说,这可能是一笔不错的交易

演示某些功能的示例代码(该代码从ViewModel调用):

PageFactory.GetPageFromCache()
.ResetPageModel()
.SendActionToPageModel((model)=>{model.Message=“Hello World!”;})
.PushPage();
模型-视图-视图-模型(MVVM)体系结构模式是在考虑XAML的情况下发明的。该模式通过充当视图和模型(ViewModel)之间中介的类,强制将XAML用户界面(视图)与底层数据(模型)分离。视图和ViewModel通常通过XAML文件中定义的数据绑定进行连接。视图的BindingContext通常是ViewModel的一个实例

您不需要使用ReactiveUI或MVVM Light,只需使用INotifyPropertyChanged接口通知客户端属性值已更改。下面,您可以看到我的ViewModelBase类代码,希望这对您有所帮助

public class ViewModelBase : INotifyPropertyChanged
{
    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}
在我的ViewModel中,这里是如何从ViewModelBase继承以及如何创建属性

public class ImageButtonViewModel : ViewModelBase
{
 // ...
 private string header;
 public string Header
 {
      get
      {
          return header;
       }
      set
        {
          header = value;
          OnPropertyChanged();
         }
  }
// ...
}

我一直在使用非常成功,我没有看到任何错误,我仍在调查,但这已成为我的项目的一个伟大的候选人。

我希望我帮了忙


一句问候语

简单的事实是MVVM框架(及其IOC容器)是节省时间的捷径。他们付出了巨大的代价:

它们导致视图、视图模型和模型之间的对齐过于简单。只有一个人才能真正属于另一个人。这不是“IOC”--这是一个基于文件命名约定的硬编码分配,例如:

主页

主视图模型

主模型

在真实的注入场景中,任意数量的模型都可以服务于任意数量的视图模型,只要它们实现了正确的接口。此外,只要视图模型支持视图接口,任意数量的视图模型都可以服务于任意数量的视图

MVVM框架通过使用字符串前缀的反射技巧创建类。在前面的示例中,字符串“Main”允许我们查找页面、视图模型和模型。但这不是视图模型到视图模型的导航。查看模型导航是字符串

框架使用Activator.CreateInstance创建类,这会对编译时链接器造成严重破坏

这些框架使用超简单的构造函数参数逻辑进行实例化。现代程序使用实例化作为一种控制形式。在这些框架中,没有真正的控制

这些备注的完整代码位于。请参阅名为MvvmAntipattern.sln的解决方案


GitHub站点还提供了有关此主题的更详细讨论的链接。

如果您只需要INotifyPropertyChanged,那么您将从中受益。这些框架通常会带来一些不错的工具,比如DI、自动加载/绑定等等。他们只是让生活变得简单一点。
public class ImageButtonViewModel : ViewModelBase
{
 // ...
 private string header;
 public string Header
 {
      get
      {
          return header;
       }
      set
        {
          header = value;
          OnPropertyChanged();
         }
  }
// ...
}