在 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 吗?

在 MVVMLight 中正确使用 MEF,了解 ViewModelLocator

我不知道

这是否是"正确"的方式,但我也不直接使用ViewModelLocator。 我通常使用 Prism,并使用引导程序方法实现 MEF,但我通过这样做将我的视图连接到他们的视图模型:

[Import]
public TransactionViewModel ViewModel
{
    get { return (TransactionViewModel)DataContext; }
    set { DataContext = value; }
}
这是在我的视图

的代码隐藏中表示我的视图模型的属性。这样我就不会对窗口的构造函数做任何事情。 在您的示例中,您不再有默认构造函数(至少您显示)。 虽然这可能不是问题,但如果您养成了这样做的习惯,然后需要让 WPF 为您实例化视图(例如在数据上下文中),那么您将遇到问题。

但除此之外,你正在做的事情对我来说看起来很标准。 您可能还想查看 Prism 对 MEF 的实现。 Prism还包括Unity,它实现了不同的目的,并且还有其他好处,使创建应用程序框架变得更加容易。