2009-04-23 65 views
7

我刚刚开始使用WPF中的MVVM模式,并且决定构建我的代码的最优雅方式是将视图模型注入到视图的构造函数中。MVVM - 视图是否真的需要一个默认构造函数?

这一切都很好,但ReSharper在XAML中给出警告,我的视图没有默认的构造函数。我假设这是为了能够在需要时在XAML中构建我的视图,但这只是一个猜测。

通过要求我的视图在构造函数中使用视图模型,我放弃了什么?

编辑:我的观点的构造是这样的:

public ExampleView(ExampleViewModel viewModel) 
{ 
    if (viewModel == null) throw new ArgumentNullException("viewModel"); 
    DataContext = viewModel; 
} 

答:我在下面设置,在设计时命名空间包含嘲笑了用于测试和设计时间视图模型的版本解决支持。

ExampleView.xaml.cs

public ExampleView() 
{ 
    InitializeComponent(); 
} 

public ExampleView(IExampleViewModel viewModel) 
    : this() 
{ 
    DataContext = viewModel; 
} 

ExampleView.xaml

<UserControl 
    x:Class="Wpf.Examples.ExampleView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:DesignTime="clr-namespace:Wpf.Examples.DesignTime"> 

    <UserControl.DataContext> 
     <DesignTime:ExampleViewModel/> 
    </UserControl.DataContext> 

</UserControl> 

回答

8

正如您正确认识到的那样,要求使用非默认构造函数将会拒绝您使用XAML中的该控件。这也意味着没有更多的设计支持,你的设计师可能会讨厌你。最后你打破各种不错的数据绑定方案。像使用控件一样ItemTemplate

作为缺失设计支持的补救措施,我建议实施一个默认构造函数,创建一个不需要任何基础结构的模拟视图模型。这样,您可以非常优雅地支持设计模式,并将视图置于XAML文件中(例如,用于测试)会做出明智的决定。

作为对缺失数据绑定支持的补救措施,您应该思考通过WPF控件的DataContext消费视图模型是否会更好。这在WPF中是很常见的,只要我可以告诉---将模型传递给WPF视图的预期方式。

+0

无论如何,我在构造函数中设置DataContext,有没有更好的模式呢? – 2009-04-23 07:14:14

0

假设你不需要设计师的支持,那么,我认为没有理由。

0

为了保持设计师的支持,你需要一个默认的构造函数。当你定义你自己的构造函数时,你基本上会放弃自动生成的默认构造函数。只要创建一个明确的默认构造函数,你应该没问题。

相关问题