gpt4 book ai didi

c# - 如何不使用 MVVM UI 模式的默认构造函数?

转载 作者:行者123 更新时间:2023-11-30 16:56:12 25 4
gpt4 key购买 nike

使用 DIWPFMVVM 一起申请UI 架构设计模式。

设置 Window.DataContext 属性时,编译器会报错:

The type [("my view model type")] does not include any accessible constructors.

这一定是我的 View 模型类中没有设置默认构造函数。

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 ,所以因为我的 View 模型类依赖于 ObservableCollection ,它必须通过构造函数接受它。然后,找到解决问题的唯一方法是在类中有一个默认构造函数。

ProductManagementViewModel

public class ProductManagementViewModel 
: ViewModel<ObservableCollection<Product>> {
public ProductManagementViewModel()
: this(new ObservableCollection<Product>()) { }
[...]
}

这让我觉得有点脏,好像我别无选择。

如何使用 MVVM UI 模式不使用默认构造函数?

最佳答案

在您提供的示例代码中,您使用的是 View 优先方法,其中 View 模型绑定(bind)到 XAML 中的 View ,这限制了您必须在 View 模型中具有默认构造函数。获得所需内容的最快方法是在代码隐藏中简单地设置 View 数据上下文,但由于我认为您正在寻找更干净的解决方案,this article列出更多。

但是,我建议考虑使用 MVVM 框架。它们不仅有助于解决这个问题(例如在 Caliburn.Micro 中 View 模型可以独立于 View 进行管理,使用 DI 或任何你喜欢的,并且连接是基于类名完成的)而且它们通常提供许多更有用的工具来帮助实现 MVVM 模式。

关于c# - 如何不使用 MVVM UI 模式的默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com