C# 可移植类库中的WPF MVVM编程

C# 可移植类库中的WPF MVVM编程,c#,.net,wpf,mvvm,portable-class-library,C#,.net,Wpf,Mvvm,Portable Class Library,这些天我正在使用.NET平台的WPF和MVVM相关功能和工具进行一个新的c#项目。我对这种类型的应用程序开发是完全陌生的。在我开始学习像ICommand和INotifyPropertyChanged这样的东西之后,我注意到当我深入研究这些类和名称空间System.Windows.Input时,我实际上正在远离可移植性 在我坚持使用MVVM之前,我曾为我的应用程序的业务层创建一个可移植类库 这些来自PresentationCore.dll的MVVM类是否在其他平台(如Xamarin android

这些天我正在使用.NET平台的
WPF
MVVM
相关功能和工具进行一个新的c#项目。我对这种类型的应用程序开发是完全陌生的。在我开始学习像
ICommand
INotifyPropertyChanged
这样的东西之后,我注意到当我深入研究这些类和名称空间
System.Windows.Input
时,我实际上正在远离可移植性

在我坚持使用
MVVM
之前,我曾为我的应用程序的业务层创建一个可移植类库

这些来自
PresentationCore.dll
MVVM
类是否在其他平台(如Xamarin android、iOS和mac)中得到了很好的支持?如果我在一个可移植类库中使用
ICommand
CommandManager
和其他类,我是否也能够在其他提到的平台中使用实现的库

离开便携性是什么意思

例如,我们想开发一个可以移植到windows和android平台的应用程序。当我实现
ICommand
时,我只能将该命令与
WPF
控件一起使用,尽管我可以在xamarin android应用程序中的按钮的单击事件处理程序中轻松调用该方法。因此,在本例中,ICommand在Xamarin android应用程序中是无用的


请告诉我,当我们在一个可移植的类库中编写代码> MVVM时,我们应该考虑什么?
MVVM
PCL
有什么共同点?当它们的概念和功能彼此不协调时?

简单回答:可移植性不是WPF的主要设计目标之一。从:“Windows演示基金会(WPF)的主要目标是帮助开发人员创建有吸引力和有效的用户界面”。更具体地说,它是为了帮助开发人员为Windows创建用户界面,因此是W。鉴于视图模型和视图之间松散但隐含的耦合,这意味着您最好的可移植性IMO是在您的模型中,也可能是在您的ORM中。只要您坚持良好的SOC实践,这可能是您在不依赖第三方解决方案的情况下获得的最佳解决方案……这通常会进一步降低可移植性,同时在其他地方增加很多麻烦。

您的可移植性与WPF无关

命令(
ICommand
implementation)和视图模型(
INotifyPropertyChanged
)是可移植的,不依赖于WPF本身,至少在较新的.NET框架中是如此

Prism、Microsofts Practice&Patterns MVVM框架是可移植的。适用于台式机、Windows Phone/Mobile、WPF、Silverlight和Xamarin

您的视图不应该是可移植的。Xamarin不久前发布了Xamarin表单,这与WPF/Windows Phone开发类似,因为它使用XAML进行UI并支持数据绑定(因此也支持ICommand和ViewModel绑定)

如果您想开发MVVM应用程序,就不应该使用旧的Xamarin UI系统

为确保不允许包含viewmodels和命令的便携库/程序集引用Presentation.dll和其他WPF程序集


如果他们这样做,您就违反了MVVM原则,您的代码将无法移植。在这种情况下,您需要重构代码并更好地理解MVVM。不参考WPF就可以使用ViewModels和命令。

首先,请参阅。视图通常不可移植,因为它们高度依赖于表示框架。Imho,因为viewmodels应该以易于从视图中使用的方式公开数据和行为,所以viewmodels也不可移植。不过,您可以将共享逻辑从viewmodels提取到PCL,然后viewmodels将只是非常薄的特定于框架的层。它会影响您的MVVM体系结构