我一直在使用在线提供的 MVVM 示例中通常提到的基本设计模式编写我所有的 MVVM 应用程序。我遵循的模式如下所述:
模型
本节包括 DTO 类及其属性和接口 IDataService 等:
public class Employee
{
public string EmployeeName { get; set; }
public string EmployeeDesignation { get; set; }
public string EmployeeID { get; set; }
}
public interface IDataService
{
public Task<Employee> GetEmployeeLst();
}
代理人
该层包含实现 IDataservice 的 Dataservice 调用,例如:
public class DataService : IDataService
{
public async Task<Employee> GetEmployeeLst()
{
// Logic to get employee data from HTTPClient call
}
}
视图模型
该层包含 ViewModel 以及对从中接收所有数据的模型和代理层的引用:
public class BaseViewModel
{
public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt, IGeoLocationService geoLocation, IMessageBus msgBus, ISmartDispatcher smtDispatcher)
{
}
// This also include common methods and static properties that are shared among most of the ViewModels
}
所有的 ViewModel 都继承 BaseViewModel。每个 viewModel 还包含在 UI 触发事件时执行的 Delegatecommand。然后,它通过在代理层调用 DataService 从服务器获取数据并执行业务逻辑并填充绑定到视图的 ViewModel 中的属性。对于每个 View,都有一个绑定到 View 的 Datacontext 的 VM。ViewModel 还负责启动我使用触发器启动故事板的动画,该故事板绑定到我在 VM 中的枚举以更改这些触发器的状态,例如: http: //www.markermetro.com/2011/05/technical/ mvvm-friendly-visual-state-management-with-windows-phone-7/
看法
在这一层中,我拥有所有视图、用户控件和业务逻辑,并实现了某些依赖项,例如 GeoLocation 服务、AES 加密、视图之间的 NavigationService 等。
每个视图都有 .xaml 和 .xaml.cs 文件。在 .xaml.cs 文件中,我将视图的数据上下文与 VM 绑定,如下所示:
this.DataContext = App.IOConatiner.GetInstance<DashboardViewModel>();
从这里开始,所有的绑定都会发生。
我的问题是,最近我知道这种模式没有遵循我在回答我的问题时了解到的 SOLID 设计模式: Simple Injector injection multiple dependency in BaseClass
我正在努力按照我之前的问题答案中给出的建议来改变我的设计。但我无法得到一些东西,比如:
当前 View Datacontext 绑定到 ViewModel,因此所有控件都由 VM 中的属性控制。我将如何使用处理器/服务或 DialogHandler 将其更改为上述模式?
我正在使用绑定到 UI 元素的命令属性的委托命令。执行这些命令会发生某些动作,例如动画,显示用户控件。如何在命令模式中做到这一点?
我怎样才能开始改变我当前的实现,以用最好的方法来适应所有这些变化?