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

Wpf 如何在没有参数化构造函数的情况下加载PRISM V4视图?,wpf,mef,prism-4,Wpf,Mef,Prism 4,我有一个关于视图加载方式的问题。下面显示了正确加载视图的示例代码: [ViewExport(RegionName = RegionNames.LeftRegion)] [PartCreationPolicy(CreationPolicy.Shared)] public partial class EmployeeListView : UserControl { [ImportingConstructor] public EmployeeListView(EmployeeL

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

    [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;
        }
    }
}
关于上述代码的注释:

  • 我向传入ViewModel的参数化构造函数添加了一个[ImportingConstructor]属性
  • 我还为ViewModel setter提供了一个[Import]属性,以便分配DataContext
  • 但是,在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
    }
    
    我的问题如下:

  • 如前一个示例所示,在没有类的[Importing Constructor]属性的情况下,如何实例化视图
  • 什么触发了DataContext属性的赋值?如何将值传递到ViewModel属性?在使用StockTrader的修改版本时,我创建了一个新的视图。如果我在DataContext=value行旁边放置一个断点,则永远不会命中该断点

  • 如果您不打算在构造函数中使用
    [ImportingConstructor]
    ,那么在构造函数中添加
    [ImportingConstructor]
    就没有什么意义了。另一方面,如果您的
    EmployeeListViewModel
    实例是
    EmployeeListView
    的必需依赖项,那么您可能应该通过构造函数将其传入

    双重进口将导致以下情况:

  • 该类型将使用
    [ImportingConstructor]
    属性构造,允许注入
    EmployeeListViewModel的实例
  • 在实例化类型后,属性
    模型
    将注入
    EmployeeListViewModel
    的实例
  • 如果
    EmployeeListViewModel
    在实例化过程中执行任何繁重的操作(例如访问数据库或服务),并且创建为非共享部分(
    [PartCreationPolicy(CreationPolicy.NonShared)]
    ),则不必要地实例化该部分两次,并加倍您的工作量。如果共享该部件,则问题就不那么严重了

    但在回答你的问题时

  • MEF将隐式地使用默认构造函数(
    PositionSummaryView(){}
    )来处理任何没有标记为
    ImportingConstructorAttribute
    的构造函数的类型。因此,在
    PositionSummaryView
    的情况下,它将检查
    [ImportingConstructor]
    装饰属性,不会找到它,因此将使用默认构造函数
  • 构造类型后,满足
    [Import]
    。我会很惊讶断点没有被击中,虽然。。。我会检查你的构建模式(
    Debug | Release
    ),等等

  • 非常感谢你的解释,马修。代码现在运行良好。