MVVM - View真的需要一个默认的构造函数吗?

时间:2009-04-23 06:53:36

标签: wpf mvvm dependency-injection

我刚开始使用WPF中的MVVM模式,我认为构建代码的最优雅方法是将视图模型注入到视图的构造函数中。

这一切都很好,但ReSharper在XAML中发出警告,我的视图没有默认构造函数。我假设这样我可以在XAML中根据需要构建我的视图,但这只是猜测。

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

编辑:我的视图构造函数如下所示:

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

答案:我选择了以下设置,其中DesignTime命名空间包含用于测试和设计时支持的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>

3 个答案:

答案 0 :(得分:8)

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

作为缺少设计支持的补救措施,我建议实现一个默认构造函数,该构造函数创建一个不需要任何基础结构的模拟视图模型。这样你可以非常优雅地支持设计模式,并将视图放在XAML文件中(例如用于测试)将做一些合理的事情。

作为缺少数据绑定支持的补救措施,您应该思考通过WPF控件的DataContext使用视图模型是否更好。这在WPF中很常见 - 据我所知 - 是将模型传递给WPF视图的预期方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

要保持设计师支持,您需要一个默认构造函数。当您定义自己的构造函数时,您基本上会松开自动生成的默认构造函数。只需创建一个显式的默认构造函数,你应该没问题。