WPF 将 DataContext 设置为没有默认构造函数的 ViewModel
WPF set DataContext to a ViewModel without default constructor
我有一个 ViewModel
接受多个构造函数参数。据我了解,因此设置 View 的 DataContext 的唯一方法是使用代码隐藏。
这有它的缺点:
- Visual Studio 不会显示正在构建的视图的
ViewModel
智能
- 无法在 XAML 设计器中查看我的
ViewModel
构造函数中定义的设计时数据,因为设计器只是破坏了
我有哪些选择?
我想要一个 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。
我有一个 ViewModel
接受多个构造函数参数。据我了解,因此设置 View 的 DataContext 的唯一方法是使用代码隐藏。
这有它的缺点:
- Visual Studio 不会显示正在构建的视图的
ViewModel
智能 - 无法在 XAML 设计器中查看我的
ViewModel
构造函数中定义的设计时数据,因为设计器只是破坏了
我有哪些选择?
我想要一个 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。