关于ViewModelLocator在MVVMLight中正确使用MEF

时间:2013-02-01 08:02:46

标签: c# mvvm mef mvvm-light

我正在尝试使用MEF和MVVMLight来构建我的应用程序。

我已经设法将某些内容连接在一起,因为它工作正常并且导入成功但在此过程中我似乎完全错过了ViewModelLocator,我只是想知道如何使用ViewModelLocator正确使用MEF,如果你真的需要一个是否我的设计出了问题?

所以在我的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吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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