【问题标题】:MVVM - Does the View really need have to have a default constructor?MVVM - 视图真的需要有一个默认的构造函数吗?
【发布时间】:2009-04-23 06:53:36
【问题描述】:

我刚刚开始使用 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>

【问题讨论】:

    标签: wpf mvvm dependency-injection


    【解决方案1】:

    正如您正确认识的那样,需要一个非默认构造函数将拒绝您使用 XAML 中的该控件。这也意味着不再提供设计支持,您的设计师可能会讨厌您。最后,你打破了各种漂亮的数据绑定场景。就像将控件用作ItemTemplate。

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

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

    【讨论】:

    • 我在构造函数中设置了DataContext,有更好的模式吗?
    • 使用工厂?手动设置 DataContext?创建一个空的默认构造函数?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-08
        • 2023-04-07
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        相关资源
        最近更新 更多