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

Jac*_*ley 7 wpf dependency-injection mvvm

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

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

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

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

public ExampleView(ExampleViewModel viewModel)
{
    if (viewModel == null) throw new ArgumentNullException("viewModel");
    DataContext = viewModel;
}
Run Code Online (Sandbox Code Playgroud)

答:我选择了以下设置,其中DesignTime命名空间包含用于测试和设计时支持的ViewModel的模拟版本.

ExampleView.xaml.cs

public ExampleView()
{
    InitializeComponent();
}

public ExampleView(IExampleViewModel viewModel)
    : this()
{
    DataContext = viewModel;
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Dav*_*itt 8

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

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

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