gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:21:01 26 4
gpt4 key购买 nike

我正在尝试使用 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,并使用 Bootstrap 方法实现 MEF,但我通过这样做将我的 View 连接到他们的 View 模型:

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

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

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

关于c# - 关于 ViewModelLocator 在 MVVMLight 中正确使用 MEF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14641995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com