WPF 将 DataContext 设置为没有默认构造函数的 ViewModel

WPF set DataContext to a ViewModel without default constructor

我有一个 ViewModel 接受多个构造函数参数。据我了解,因此设置 View 的 DataContext 的唯一方法是使用代码隐藏。

这有它的缺点:

我有哪些选择?

我想要一个 ViewModel 可以接受构造函数参数,具有设计时间数据,并且我的 Visual Studio 智能为我提供有关 ViewModel 成员的建议,这样我就可以有良好的设计经验。

PS。我使用的是 Microsoft 的 MVVM Toolkit / Windows Community Toolkit,但对于如何实现我的最终目标的任何回答,我将不胜感激。谢谢。

使用参数化构造函数分配 view-model 作为视图的数据上下文的最简洁方法是使用 ViewModelLocator 模式。

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        // define view-model definitions in IoC container.
    }

    public MainViewModel MainViewModel
    {
        get
        {
            // use the appropriate construct for your choice of IoC container
            var result = IoCContainer.GetInstance<MainViewModel>();
            return result;
        }
    }
}

可以在 App.xaml

中创建此 class 的实例
<Application.Resources>
    <local:ViewModelLocator x:Key="ViewModelLocator">
</Application.Resources>

它成为应用程序范围的资源,可以在每个视图中引用。

现在我们可以随时获取特定 view-model 的实例,包括在设计器中,并将其指定为视图的 DataContext。

<Window
    x:Class="MyApplication.MainView"
    ...
    DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=MainViewModel}" />

有关此 ViewModelLocator 模式用法的更多详细信息,包括在您的 ViewModel 中包含 design-time 数据,请查看我的 blog post

What are my options?

一种常见的方法是使用无参数构造函数创建单独的设计时视图模型class,并将设计时数据上下文设置为此类型:

<Window ... d:DataContext="{d:DesignInstance Type=local:DesignTimeViewModel, IsDesignTimeCreatable=True}"

您不应该做的是根据 Visual Studio 中设计器的工作方式来设计您的应用程序并定义您的 classes。