在 MVVMLight 中正确使用 MEF,了解 ViewModelLocator
本文关键字:MEF 了解 ViewModelLocator MVVMLight | 更新日期: 2023-09-27 17:57:11
我正在尝试使用MEF和MVVMLight来构建我的应用程序。
我已经设法将一些东西连接在一起,可以成功工作和导入,但在此过程中,我似乎完全错过了 ViewModelLocator,我只是想知道您如何将 MEF 与 ViewModelLocator 正确使用,也许您是否真的需要一个,或者我的设计是否出错了?
所以在我的 App.xaml 中,我禁用了 startupUri,而在 App.xaml 中.cs我这样做:
[Import("MainWindow", typeof(Window))]
public new Window MainWindow
{
get { return base.MainWindow; }
set { base.MainWindow = value; }
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// Load catalog in normal way
...
MainWindow.Show();
}
我的主窗口代码是这样的:
[Export("MainWindow", typeof(Window))]
public partial class MainWindow : Window
{
[ImportingConstructor]
public MainWindow([Import("MainViewModel")] MainViewModel vm)
{
InitializeComponent();
DataContext = vm;
}
}
最后我的视图模型是这样的:
[Export("MainViewModel", typeof(MainViewModel))]
public class MainViewModel : ViewModelBase, IPartImportsSatisfiedNotification
{
// I do some MEF imports here also
}
但是我以正确的方式这样做,还是有更明智的方法?我真的可以忽略 ViewModelLocator 吗?
我不知道
这是否是"正确"的方式,但我也不直接使用ViewModelLocator。 我通常使用 Prism,并使用引导程序方法实现 MEF,但我通过这样做将我的视图连接到他们的视图模型:
[Import]
public TransactionViewModel ViewModel
{
get { return (TransactionViewModel)DataContext; }
set { DataContext = value; }
}
这是在我的视图的代码隐藏中表示我的视图模型的属性。这样我就不会对窗口的构造函数做任何事情。 在您的示例中,您不再有默认构造函数(至少您显示)。 虽然这可能不是问题,但如果您养成了这样做的习惯,然后需要让 WPF 为您实例化视图(例如在数据上下文中),那么您将遇到问题。
但除此之外,你正在做的事情对我来说看起来很标准。 您可能还想查看 Prism 对 MEF 的实现。 Prism还包括Unity,它实现了不同的目的,并且还有其他好处,使创建应用程序框架变得更加容易。