可用MVVM框架所需的部分

时间:2010-09-17 11:11:17

标签: .net wpf vb.net mvvm

当我的公司从VB6迁移到.NET框架时,看起来我们正朝着WPF的方向发展(我的老板爱上了Office风格的Ribbon控件)。我一直在努力在WPF中模拟我们的一个VB6应用程序,并决定同时试验MVVM。我不鼓励使用现有的MVVM框架,所以我想我需要编写自己的MVVM框架。现在最大的担忧似乎是从中心位置(经理类)注册和管理我的所有观点的方法 - 但我不确定如何实现这一点。我看到有关IoC和ServiceLocator的文章,但有时间将这些想法用于使用。

是否有人对我应该实现的功能和模式提出建议,以制作一个非常轻量级但可维护的MVVM框架?除了现有的框架之外,您将使用哪些现有代码资源来帮助推进这样的项目?

4 个答案:

答案 0 :(得分:4)

我强烈建议您观看"Build your own MVVM Framework" Rob创建者Eisenberg Caliburn frameworkCalibrun 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)

从你的话来说,我猜你的问题不是MVVM,而是导航问题。

当我开始时,我遇到了同样的问题,并且不确定如何实现视图的创建并在它们之间导航。

看看Magellan Framework。它可以进行导航等等。

答案 3 :(得分:0)

我认为构建自己的MVVM框架是个好主意。

我认为在不检查其他MVVM框架,调查它们包含哪些工具以及理解它们的设计的情况下,这样做是不太好的想法。构建一个最低限度有用的MVVM工具包并不是一件大事,但要弄清楚需要构建哪些工具需要做很多工作。

另外,如果你看看其他开发人员解决你认为面临的一些问题的方式,你可能会发现你还没有真正理解这个问题。