在WPF应用程序中使用DI以及MVVM UI体系结构设计模式。
设置 Window.DataContext
属性时,编译器会抱怨:
类型[("我的视图模型类型")] 不包含任何可访问的构造函数。
这一定是在我的视图模型类中没有设置默认构造函数。
产品管理视图模型
public class ProductManagementViewModel
: ViewModel<ObservableCollection<Product>, Product> {
public ProductManagementViewModel(ObservableCollection<Product> model)
: base(model) { }
public Product Current { get; set; }
}
产品管理视图.xaml
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Models="clr-namespace:WMI.Courses.DesignPatterns.Mvvm.Models"
xmlns:ViewModel="clr-namespace:MyProject.ProductManagement.Management"
mc:Ignorable="d"
x:Class="MyProject.ProductManagement.Management.ProductManagementView"
ResizeMode="NoResize"
Title="{Binding ViewTitle}"
Width="800">
<Window.DataContext>
<ViewModel:ProductManagementViewModel />
</Window.DataContext>
[...]
</Window>
此外,最好使用构造函数注入,因此由于我的视图模型类依赖于 ObservableCollection,因此它必须通过构造函数接受它。然后,找到解决问题的唯一方法是在类中有一个默认构造函数。
产品管理视图模型
public class ProductManagementViewModel
: ViewModel<ObservableCollection<Product>> {
public ProductManagementViewModel()
: this(new ObservableCollection<Product>()) { }
[...]
}
这让我觉得有些肮脏,就像我别无选择一样。
如何不使用使用 MVVM UI 模式的默认构造函数?
在你提供的示例代码中,你使用的是视图优先方法,其中视图模型绑定到 XAML 中的视图,这限制了你必须在视图模型中具有默认构造函数。获得所需内容的最快方法是简单地在代码隐藏中设置视图数据上下文,但由于我认为您正在寻找更干净的解决方案,因此本文列出了更多。
但是,我建议考虑使用 MVVM 框架。它们不仅有助于解决此问题(例如,在 Caliburn.Micro 视图中,可以使用 DI 或任何您喜欢的东西独立于视图进行管理,并且连接是基于类名完成的),而且它们通常提供了更多有用的工具来帮助实现 MVVM 模式。