C# 如何使用空代码隐藏文件将构造函数参数解析为ViewModel

C# 如何使用空代码隐藏文件将构造函数参数解析为ViewModel,c#,.net,wpf,mvvm-light,C#,.net,Wpf,Mvvm Light,我的视图构造函数有一个参数IDatabase\u db,但我希望我的ViewModel得到这个参数,但我用这种方式创建我的VM xmlns:vm=“clr命名空间:OppStd.ViewModel” 为了得到一个空的代码隐藏文件,现在我不知道如何使用XAML将这个参数路由到我的viewmodel 那么有可能解析这个构造函数吗?另外,我使用的是MVVM灯光,如果这会产生影响如果使用的是MVVM灯光,则应该使用ViewModelLocator来解析视图模型。教程,如更详细的解释。视图模型不需要

我的视图构造函数有一个参数IDatabase\u db,但我希望我的ViewModel得到这个参数,但我用这种方式创建我的VM


xmlns:vm=“clr命名空间:OppStd.ViewModel”

为了得到一个空的代码隐藏文件,现在我不知道如何使用XAML将这个参数路由到我的viewmodel


那么有可能解析这个构造函数吗?另外,我使用的是MVVM灯光,如果这会产生影响

如果使用的是MVVM灯光,则应该使用ViewModelLocator来解析视图模型。教程,如更详细的解释。

视图模型不需要了解视图。 视图也不需要了解数据库


为什么视图的构造函数采用参数
IDatabase\u db
?最有可能的情况是您应该对此进行更改。

我将创建一个静态属性,返回对数据库的引用,取而代之的是viewmodel可以调用Yes,这将起作用并与您使用的MVVM模式兼容。但是,您可能希望将数据库引用传递给其构造函数中的视图模型(称为依赖项注入),或者使用服务定位器(这是实现控制反转的另一种方法)。我更喜欢前者,但后者最近似乎风靡一时,可能与MVVM Light的工作方式非常吻合。在VM中使用注入是可以的,尽管我通常使用抽象服务来实现这一点(例如IDataService,它不会通知VM如何准确解析数据)。但是,正如您所发现的,如果VM是在XAML中创建的(XAML作为序列化语言需要默认构造函数),则不能使用注入(或任何参数)。正如Kent提到的,使用ViewModelLocator有助于实现这一点。有关详细信息,请参阅和上的我的视频。我也更喜欢依赖注入。查看我在前面的评论中提到的视频,您将看到MVVM Light中使用的技术来实现这一点:) <UserControl.DataContext> <vm:ViewModel/> </UserControl.DataContext>