如何不使用 MVVM UI 模式的默认构造函数?
How not to use the default constructor using the MVVM UI Pattern?
使用DI in a WPF application along with the MVVMUI架构设计模式。
当设置 Window.DataContext
属性 时,编译器报错:
The type [("my view model type")] does not include any accessible constructors.
这一定是我的视图模型中没有设置默认构造函数 class。
ProductManagementViewModel
public class ProductManagementViewModel
: ViewModel<ObservableCollection<Product>, Product> {
public ProductManagementViewModel(ObservableCollection<Product> model)
: base(model) { }
public Product Current { get; set; }
}
ProductManagementView.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>
此外,最好使用Constructor Injection, so since my View Model class depends on an ObservableCollection,它必须通过构造函数接受它。然后,找到解决问题的唯一方法是在 class.
中使用默认构造函数
ProductManagementViewModel
public class ProductManagementViewModel
: ViewModel<ObservableCollection<Product>> {
public ProductManagementViewModel()
: this(new ObservableCollection<Product>()) { }
[...]
}
这让我觉得有些肮脏,而且我别无选择。
如何使用 MVVM UI 模式不使用默认构造函数?
在您提供的示例代码中,您使用的是视图优先方法,其中视图模型绑定到 XAML 中的视图,这限制了您必须在视图中使用默认构造函数模型。获得所需内容的最快方法是在代码隐藏中简单地设置视图数据上下文,但由于我认为您正在寻找更干净的解决方案,this article 列出了更多。
但是,我建议考虑使用 MVVM 框架。它们不仅有助于解决这个问题(例如,在 Caliburn.Micro 中,视图模型可以独立于视图进行管理,使用 DI 或任何你喜欢的方式,并且连接是基于 class 名称完成的),而且它们通常提供更多有用的工具来帮助实现 MVVM 模式。
使用DI in a WPF application along with the MVVMUI架构设计模式。
当设置 Window.DataContext
属性 时,编译器报错:
The type [("my view model type")] does not include any accessible constructors.
这一定是我的视图模型中没有设置默认构造函数 class。
ProductManagementViewModel
public class ProductManagementViewModel
: ViewModel<ObservableCollection<Product>, Product> {
public ProductManagementViewModel(ObservableCollection<Product> model)
: base(model) { }
public Product Current { get; set; }
}
ProductManagementView.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>
此外,最好使用Constructor Injection, so since my View Model class depends on an ObservableCollection,它必须通过构造函数接受它。然后,找到解决问题的唯一方法是在 class.
中使用默认构造函数ProductManagementViewModel
public class ProductManagementViewModel
: ViewModel<ObservableCollection<Product>> {
public ProductManagementViewModel()
: this(new ObservableCollection<Product>()) { }
[...]
}
这让我觉得有些肮脏,而且我别无选择。
如何使用 MVVM UI 模式不使用默认构造函数?
在您提供的示例代码中,您使用的是视图优先方法,其中视图模型绑定到 XAML 中的视图,这限制了您必须在视图中使用默认构造函数模型。获得所需内容的最快方法是在代码隐藏中简单地设置视图数据上下文,但由于我认为您正在寻找更干净的解决方案,this article 列出了更多。
但是,我建议考虑使用 MVVM 框架。它们不仅有助于解决这个问题(例如,在 Caliburn.Micro 中,视图模型可以独立于视图进行管理,使用 DI 或任何你喜欢的方式,并且连接是基于 class 名称完成的),而且它们通常提供更多有用的工具来帮助实现 MVVM 模式。