C# 关于ViewModelLocator在MVVMLight中正确使用MEF

C# 关于ViewModelLocator在MVVMLight中正确使用MEF,c#,mvvm,mef,mvvm-light,C#,Mvvm,Mef,Mvvm Light,我正在尝试使用MEF和MVVMLight来构建我的应用程序 现在,我已经成功地将一些东西连接在一起并成功导入,但在此过程中,我似乎完全错过了ViewModelLocator,我只是想知道您如何正确地将MEF与ViewModelLocator结合使用,也许您真的需要一个,或者我的设计是否出了问题 因此,在我的App.xaml中,我禁用startupUri,在App.xaml.cs中,我执行以下操作: [Import("MainWindow", typeof(Window))] public new

我正在尝试使用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;
    }
}
最后,我的ViewModel是:

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

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

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

[Import]
public TransactionViewModel ViewModel
{
    get { return (TransactionViewModel)DataContext; }
    set { DataContext = value; }
}
这是在视图的代码隐藏中表示我的ViewModel的属性。这样,我就不会对窗口的构造函数做任何事情。在您的示例中,您不再具有默认构造函数(至少您显示的是)。虽然这在这里可能不是问题,但如果您养成了这样做的习惯,然后需要让WPF为您实例化一个视图(比如在datacontext中),那么您将遇到问题


但除此之外,你所做的在我看来相当标准。您可能也想看看Prism的MEF实现。Prism还包括Unity,它实现了一个不同的目的,还有其他一些优点,使创建应用程序框架变得更容易。

以我以前的方式进行操作似乎会失去可混合性,但这是你有问题的地方吗?实际上没有-我没有问题。使用blend时会出现哪些错误?如果您仍然有一些视图或视图模型没有默认构造函数,这可能是问题所在。