2

我正在尝试使用 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();
}

我的 MainWindow 代码是这样的:

[Export("MainWindow", typeof(Window))]
public partial class MainWindow : Window
{
    [ImportingConstructor]
    public MainWindow([Import("MainViewModel")] MainViewModel vm)
    {
        InitializeComponent();
        DataContext = vm;
    }
}

最后我的 ViewModel 是这样的:

[Export("MainViewModel", typeof(MainViewModel))]
public class MainViewModel : ViewModelBase, IPartImportsSatisfiedNotification
{
    // I do some MEF imports here also
}

但是我以正确的方式做这件事还是有更明智的方法?我真的可以忽略 ViewModelLocator 吗?

4

1 回答 1

3

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

[Import]
public TransactionViewModel ViewModel
{
    get { return (TransactionViewModel)DataContext; }
    set { DataContext = value; }
}

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

但除此之外,你所做的对我来说看起来很标准。您可能还想查看 Prism 的 MEF 实现。Prism 还包括 Unity,它实现了不同的目的,并且还有其他好处,可以更轻松地创建应用程序框架。

于 2013-02-04T05:24:14.010 回答