Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf MVVM-视图真的需要有默认构造函数吗?_Wpf_Mvvm_Dependency Injection - Fatal编程技术网

Wpf MVVM-视图真的需要有默认构造函数吗?

Wpf MVVM-视图真的需要有默认构造函数吗?,wpf,mvvm,dependency-injection,Wpf,Mvvm,Dependency Injection,我刚刚开始使用WPF中的MVVM模式,我认为构建代码最优雅的方式是将视图模型注入到视图的构造函数中 这一切都很好,但是ReSharper在XAML中给出了一个警告,我的视图没有默认构造函数。我假设这是为了在需要时可以在XAML中构造视图,但这只是一个猜测 通过要求视图在构造函数中采用视图模型,我放弃了什么 编辑:我的视图构造函数如下所示: public ExampleView(ExampleViewModel viewModel) { if (viewModel == null) thr

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

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

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

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

public ExampleView(ExampleViewModel viewModel)
{
    if (viewModel == null) throw new ArgumentNullException("viewModel");
    DataContext = viewModel;
}
回答:我决定进行以下设置,其中DesignTime命名空间包含ViewModel的模拟版本,用于测试和设计时支持

ExampleView.xaml.cs

ExampleView.xaml



假设您不需要设计器支持,那么我看不出任何理由

要保持设计器支持,您需要一个默认构造函数。当您定义自己的构造函数时,基本上失去了自动生成的默认构造函数。只要创建一个显式的默认构造函数,就可以了。

正如您正确认识到的,需要一个非默认构造函数将拒绝您从XAML使用该控件。这也意味着没有更多的设计支持,你的设计师可能会讨厌你。最后,您打破了各种良好的数据绑定场景。类似于将控件用作
项模板

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


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

我正在构造函数中设置DataContext,是否有更好的模式?使用工厂?是否手动设置DataContext?创建一个空的默认构造函数?
public ExampleView()
{
    InitializeComponent();
}

public ExampleView(IExampleViewModel viewModel)
    : this()
{
    DataContext = viewModel;
}
<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>