Xamarin.Forms的MVVM框架
有人能解释一下,像ReactiveUI或MVVM Light这样的MVVM框架对Xamarin.Forms应用程序有什么好处吗?我们可以在viewmodels中实现INotifyPropertyChanged,而无需使用任何这些框架。Xamarin.Forms的MVVM框架,mvvm,xamarin.forms,Mvvm,Xamarin.forms,有人能解释一下,像ReactiveUI或MVVM Light这样的MVVM框架对Xamarin.Forms应用程序有什么好处吗?我们可以在viewmodels中实现INotifyPropertyChanged,而无需使用任何这些框架。 我错过什么了吗 MVVM框架不仅仅是INotifyPropertyChanged。仅举几个例子: RelayCommand-一个类,可以提供ICommand接口的实现,并允许您将委托绑定到视图。用于按钮 EventToCommand-这允许您将事件绑定到视图模型
我错过什么了吗 MVVM框架不仅仅是
INotifyPropertyChanged
。仅举几个例子:
- RelayCommand-一个类,可以提供
接口的实现,并允许您将委托绑定到视图。用于按钮ICommand
- EventToCommand-这允许您将事件绑定到视图模型中的命令。而不必为
ui元素事件使用代码隐藏
MVVMLight
通过使用MVVMLight,您不必在每个项目中实现INotifyPropertyChanged
,只需确保您的ViewModel
继承自ViewModelBase
,并且您也不必在每个项目中为上述两个类编写自己的实现
最后要提到的是,您还可以为MVVMLight
安装代码片段。这意味着编写代码更快
例如,如果您想更改引发属性的属性,只需使用mvvmlight属性片段。同样,如果您想要
RelayCommand
属性,您可以使用mvvmlight RelayCommand
snippet我是Xamarin.Forms()的小型MVVM框架的作者。我将尝试指出使用它的一些优点,因为其他框架也有一些常见的功能:
- 可以使用的
实现(仅从INotifyPropertyChanged
或BaseViewModel
继承)BaseModel
- 面向视图模型的导航(您可以将导航逻辑移动到视图模型)
- 内置消息传递,可在页面或视图模型之间轻松传递数据/参数
- 页面缓存和重用(随着视图/页面的重用,用户界面体验会更好)
- 每个页面都可以访问类型化的ViewModel实例,该实例将自动实例化并连接到BindingContext
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();
}
}
// ...
}