我正在尝试使用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吗?
答案 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,它实现了不同的目的,并且还有其他好处,这使得创建应用程序框架变得更加容易。