如何在没有参数化构造函数的情况下加载 PRISM V4 视图



我有一个关于视图加载方式的问题。我在下面显示了正确加载的视图的示例代码:

    [ViewExport(RegionName = RegionNames.LeftRegion)]
[PartCreationPolicy(CreationPolicy.Shared)]
public partial class EmployeeListView : UserControl
{
    [ImportingConstructor]
    public EmployeeListView(EmployeeListViewModel viewModel)
    {
        InitializeComponent();
        //this.DataContext = viewModel;
    }
    [Import]
    public EmployeeListViewModel Model
    {
        get
        {
            return DataContext as EmployeeListViewModel;
        }
        set
        {
            DataContext = value;
        }
    }
}

关于上述代码的说明:

  1. 我向在视图模型中传递的参数化构造函数添加了一个 [ImportingConstructor] 属性。
  2. 我还有一个用于 ViewModel setter 的 [Import] 属性,因此我可以分配 DataContext。

但是,在股票交易者演示中,视图的加载方式不同。例如,查找 PositionSummaryView.xaml.cs 文件。

[ViewExport(RegionName = RegionNames.MainRegion)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class PositionSummaryView : UserControl
{
    public PositionSummaryView()
    {
        InitializeComponent();
    }
    #region IPositionSummaryView Members
    [Import]
    public IPositionSummaryViewModel Model
    {
        get
        {
            return DataContext as IPositionSummaryViewModel;
        }
        set
        {
            DataContext = value;
        }
    }
    #endregion
}

我的问题如下:

  1. 如何在没有类的 [导入构造函数] 属性的情况下实例化视图,如前面的示例所示?
  2. 什么触发了数据上下文属性的分配?如何将值传递给 ViewModel 属性? 在玩弄修改版的StockTrader时,我创建了一个新视图。如果我在 DataContext = value 行旁边放置一个断点,则永远不会命中断点。

如果您不打算在构造函数中使用它做任何事情,那么将[ImportingConstructor]添加到构造函数中几乎没有意义。另一方面,如果您的 EmployeeListViewModel 实例是 EmployeeListView 的必需依赖项,那么您可能应该通过构造函数传递它。

双重导入将导致以下情况:

  1. 该类型将使用 [ImportingConstructor] 属性构造,允许注入EmployeeListViewModel的实例。
  2. 实例
  3. 化类型后,属性Model将注入 EmployeeListViewModel 实例。

如果EmployeeListViewModel在实例化期间执行任何繁重的工作(例如访问数据库或服务(,并且被创建为非共享部分([PartCreationPolicy(CreationPolicy.NonShared)](,那么您将不必要地实例化该部分两次并使工作加倍。如果部件是共享的,则问题就不大了。

不过,在回答您的问题时,

  1. MEF 将隐式使用默认构造函数 (PositionSummaryView() { }( 对于没有标有 ImportingConstructorAttribute 的构造函数的任何类型。因此,在PositionSummaryView的情况下,它将检查[ImportingConstructor]装饰属性,找不到它,因此将使用默认构造函数。
  2. 构造类型后,满足[Import]。我会惊讶于断点没有被击中......我会检查您的构建模式(Debug | Release(等。

最新更新