0

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

这有它的缺点:

  • Visual Studio 不会显示ViewModel正在构建的视图的智能
  • 无法ViewModel在 XAML 设计器中查看我的构造函数中定义的设计时数据,因为设计器只是中断了

我有哪些选择?

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

PS。我正在使用Microsoft 的MVVM Toolkit / Windows Community Toolkit,但我会很感激任何关于如何实现我的最终目标的答案。谢谢你。

4

2 回答 2

3

我有哪些选择?

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

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

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

于 2022-02-08T14:10:47.880 回答
1

将带有参数化构造函数的视图模型分配为视图的数据上下文的最简洁方法是使用该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 中创建此类的实例

<Application.Resources>
    <local:ViewModelLocator x:Key="ViewModelLocator">
</Application.Resources>

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

现在我们可以随时获取特定视图模型的实例,包括在设计器中,并将其分配为视图的 DataContext。

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

有关此 ViewModelLocator 模式使用的更多详细信息,包括在您的 ViewModel 中包含设计时数据,请查看我的博客文章

于 2022-02-07T23:35:21.653 回答