我对View的加载方式有疑问。我有一个示例代码,如下所示正确加载的视图:
[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;
}
}
}
关于上述代码的说明:
但是,在Stocktrader演示中,视图的加载方式不同。请查看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
}
我的问题如下:
答案 0 :(得分:2)
如果您不打算在构造函数中对此进行任何操作,那么将[ImportingConstructor]
添加到构造函数中没有什么意义。另一方面,如果EmployeeListViewModel
的实例是EmployeeListView
的必需依赖项,那么您可能应通过构造函数传递它。
进行双重导入将导致以下情况:
[ImportingConstructor]
属性构建类型,以允许注入EmployeeListViewModel
的实例。Model
将注入EmployeeListViewModel
的实例。 EmployeeListViewModel
在实例化期间应该做任何繁重的工作(例如访问数据库或服务),并且创建为非共享部分([PartCreationPolicy(CreationPolicy.NonShared)]
),那么你不必要地将部件实例化两次,加倍你的工作。如果部件是共享的,这不是问题。
回答你的问题,
PositionSummaryView() { }
的构造函数的任何类型,MEF将隐含使用默认构造函数(ImportingConstructorAttribute
)。因此,对于PositionSummaryView
,它将检查[ImportingConstructor]
装饰属性,找不到它,因此将使用默认构造函数。[Import]
得到满足。我很惊讶断点没有被击中......我会检查你的构建模式(Debug | Release
)等。