我有一个关于视图加载方式的问题。我在下面显示了正确加载的视图的示例代码:
[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;
}
}
}
关于上述代码的说明:
- 我向在视图模型中传递的参数化构造函数添加了一个 [ImportingConstructor] 属性。
- 我还有一个用于 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
}
我的问题如下:
- 如何在没有类的 [导入构造函数] 属性的情况下实例化视图,如前面的示例所示?
- 什么触发了数据上下文属性的分配?如何将值传递给 ViewModel 属性? 在玩弄修改版的StockTrader时,我创建了一个新视图。如果我在 DataContext = value 行旁边放置一个断点,则永远不会命中断点。
如果您不打算在构造函数中使用它做任何事情,那么将[ImportingConstructor]
添加到构造函数中几乎没有意义。另一方面,如果您的 EmployeeListViewModel
实例是 EmployeeListView
的必需依赖项,那么您可能应该通过构造函数传递它。
双重导入将导致以下情况:
- 该类型将使用
[ImportingConstructor]
属性构造,允许注入EmployeeListViewModel
的实例。
实例 - 化类型后,属性
Model
将注入EmployeeListViewModel
实例。
如果EmployeeListViewModel
在实例化期间执行任何繁重的工作(例如访问数据库或服务(,并且被创建为非共享部分([PartCreationPolicy(CreationPolicy.NonShared)]
(,那么您将不必要地实例化该部分两次并使工作加倍。如果部件是共享的,则问题就不大了。
不过,在回答您的问题时,
- MEF 将隐式使用默认构造函数 (
PositionSummaryView() { }
( 对于没有标有ImportingConstructorAttribute
的构造函数的任何类型。因此,在PositionSummaryView
的情况下,它将检查[ImportingConstructor]
装饰属性,找不到它,因此将使用默认构造函数。 - 构造类型后,满足
[Import]
。我会惊讶于断点没有被击中......我会检查您的构建模式(Debug | Release
(等。