当我的公司从VB6迁移到.NET框架时,看起来我们正朝着WPF的方向发展(我的老板爱上了Office风格的Ribbon控件)。我一直在努力在WPF中模拟我们的一个VB6应用程序,并决定同时试验MVVM。我不鼓励使用现有的MVVM框架,所以我想我需要编写自己的MVVM框架。现在最大的担忧似乎是从中心位置(经理类)注册和管理我的所有观点的方法 - 但我不确定如何实现这一点。我看到有关IoC和ServiceLocator的文章,但有时间将这些想法用于使用。
是否有人对我应该实现的功能和模式提出建议,以制作一个非常轻量级但可维护的MVVM框架?除了现有的框架之外,您将使用哪些现有代码资源来帮助推进这样的项目?
答案 0 :(得分:4)
我强烈建议您观看"Build your own MVVM Framework" Rob创建者Eisenberg Caliburn framework的Calibrun Micro演示文稿。他将向您介绍构建MVVM Framework所需的主要方面。此外,恕我直言Caliburn是最好的100 +“MVVMish”框架之一。它有很多新鲜的想法和很好的实现细节。还有{{3}}框架,它是完整框架的轻量级版本,是学习如何完成工作的良好停止。
我还建议,你不要在MVVM上过于设想隧道。即使在WPF中,也存在使用其他模式(如MVC,MVP)更好地处理的常见场景。事实上Caliburn使用所有这些模式。实际上,它真的不公正地称它为MVVM框架。
答案 1 :(得分:0)
我刚刚开始使用以下接口来生成轻量级MVVM框架,该框架旨在将控件引入到现有应用程序中。
public interface IView<C>
where C : class
{
}
public interface IView<C, VM> : IView<C>
where C : class
where VM : IViewModel
{
IDisposable Bind(VM viewModel);
}
public interface IViewModel : INotifyPropertyChanged
{
}
public interface IViewModel<M> : IViewModel
where M : class
{
IView<C> Bind<C>(M model) where C : class;
IView<C> Bind<C>(string key, M model) where C : class;
}
public interface IViewModel<VM, M> : IViewModel<M>
where VM : IViewModel<VM, M>
where M : class
{
}
以下接口是示例Person
模型和视图模型。
public interface IPerson : INotifyPropertyChanged
{
string Name { get; set; }
DateTime? Dob { get; set; }
}
public interface IPersonViewModel : IViewModel<IPersonViewModel, IPerson>
{
string Name { get; set; }
DateTime? Dob { get; set; }
int? Age { get; }
string Title { get; }
}
仅使用数据绑定的视图实现如下所示:
[Factory(typeof(IView<Control, IPersonViewModel>))]
public partial class PersonView : UserControl, IView<Control, IPersonViewModel>
{
public PersonView()
{
InitializeComponent();
}
public IDisposable Bind(IPersonViewModel viewModel)
{
this.personViewModelBindingSource.DataSource = viewModel;
return Disposable.Create(() => this.personViewModelBindingSource.Dispose());
}
}
现在,要使用这一切,我只需要以下代码:
var personM = context.Resolve<IPerson>();
var personVM = context.Resolve<IPersonViewModel>();
var personV = personVM.Bind<Control>(personM);
var personC = personV.AsControl();
personC.Dock = DockStyle.Fill;
this.panel1.Controls.Add(personC);
我正在使用依赖注入来解析模型的实例,查看模型和模型。视图。视图模型的Bind
方法为视图解析。所有这些都是强类型的,允许我们编写可以与Windows Forms,WPF和amp;的Silverlight。
我希望这对你来说已经足够了。
答案 2 :(得分:0)
答案 3 :(得分:0)
我认为构建自己的MVVM框架是个好主意。
我认为在不检查其他MVVM框架,调查它们包含哪些工具以及理解它们的设计的情况下,这样做是不太好的想法。构建一个最低限度有用的MVVM工具包并不是一件大事,但要弄清楚需要构建哪些工具需要做很多工作。
另外,如果你看看其他开发人员解决你认为面临的一些问题的方式,你可能会发现你还没有真正理解这个问题。