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

时间:2012-04-03 08:51:09

标签: wpf mef prism-4

我对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;
        }
    }
}

关于上述代码的说明:

  1. 我将[ImportingConstructor]属性添加到传入ViewModel的参数化构造函数中。
  2. 我还有一个ViewModel setter的[Import]属性,所以我可以分配DataContext。
  3. 但是,在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
    }
    

    我的问题如下:

    1. 如果没有上一个示例中显示的类的[Importing Constructor]属性,如何实例化视图?
    2. 是什么触发了DataContext属性的赋值?如何将值传递给ViewModel属性?在使用StockTrader的修改版本时,我创建了一个新视图。如果我在一行DataContext =值旁边放置一个断点,那么断点就永远不会被击中。

1 个答案:

答案 0 :(得分:2)

如果您不打算在构造函数中对此进行任何操作,那么将[ImportingConstructor]添加到构造函数中没有什么意义。另一方面,如果EmployeeListViewModel的实例是EmployeeListView的必需依赖项,那么您可能通过构造函数传递它。

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

  1. 将使用[ImportingConstructor]属性构建类型,以允许注入EmployeeListViewModel的实例。
  2. 在实例化类型后,属性Model将注入EmployeeListViewModel的实例。
  3. EmployeeListViewModel在实例化期间应该做任何繁重的工作(例如访问数据库或服务),并且创建为非共享部分([PartCreationPolicy(CreationPolicy.NonShared)]),那么你不必要地将部件实例化两次,加倍你的工作。如果部件是共享的,这不是问题。

    回答你的问题,

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