Prism Demo学习笔记

前端:

先引用Microsoft.Practices.Prism,Microsoft.Practices.Prism.UnityExtensions,Microsoft.Practices.Unity

App类中启动界面:

protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            CommandingBootstrapper bootstrapper = new CommandingBootstrapper();
            bootstrapper.Run();
        }
CommandingBootstrapper类定义如下
 public class CommandingBootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return Container.Resolve<Shell>();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();

#if SILVERLIGHT
            App.Current.RootVisual = (UIElement)this.Shell;
#else
            App.Current.MainWindow = (Window)this.Shell;
            App.Current.MainWindow.Show();
#endif
        }       

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(OrderModule));
        }

    }
页面中需要如下代码:
  <ItemsControl prism:RegionManager.RegionName="MainRegion" />

前端引用的类库,主要代码都在该类库中:

 public class OrderModule : IModule

 public class OrderModule : IModule
    {
        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;
        private readonly IRegionViewRegistry iRegionViewRegistry;
        public OrderModule( IUnityContainer container, IRegionManager regionManager,IRegionViewRegistry irvr )
        {
            this.container     = container;
            this.regionManager = regionManager;
            this.iRegionViewRegistry = irvr;
        }

        public void Initialize()
        {  //这里注册了两个类型,当在下面 OrdersEditorPresentationModel类的构造函数中使用了IOrdersRepository接口,OrdersRepository类实现接口,所以也需要注册,如果在OrdersEditorPresentationModel构造函数中不使用接口,而是使用OrderRepository类,则可以不需要注册,即使OrderRepository实现IOrdersRepository接口也不需要注册。
           this.container.RegisterType<IOrdersRepository, OrdersRepository>(new ContainerControlledLifetimeManager());

            // 注册同一个Region多次,会在界面上出现同一个控件多次,此外使用IRegionManager 和IRegionViewRegistry 都可以注册Region

            this.regionManager.RegisterViewWithRegion( "MainRegion",
                                                        () => this.container.Resolve<OrdersEditorView>() );
            iRegionViewRegistry.RegisterViewWithRegion ("MainRegion",typeof(Views.OrdersEditorView ));

            iRegionViewRegistry.RegisterViewWithRegion("GlobalCommandsRegion", typeof(OrdersToolBar));
          
            // Show the Orders Toolbar view in the shell's toolbar region.
            //this.regionManager.RegisterViewWithRegion( "GlobalCommandsRegion",
            //                                           () => this.container.Resolve<OrdersToolBar>() );
        }
    }
   

 OrdersEditorPresentationModel类定义

  public class OrdersEditorPresentationModel : INotifyPropertyChanged
    {
        private readonly IOrdersRepository  ordersRepository;
        private readonly OrdersCommandProxy commandProxy;

        private ObservableCollection<OrderPresentationModel> _orders { get; set; }

        public OrdersEditorPresentationModel( IOrdersRepository ordersRepository, OrdersCommandProxy commandProxy )
        {
            this.ordersRepository = ordersRepository;
            this.commandProxy     = commandProxy;

            // Create dummy order data.
            this.PopulateOrders();

            // Initialize a CollectionView for the underlying Orders collection.
#if SILVERLIGHT
            this.Orders = new PagedCollectionView( _orders );
#else
            this.Orders = new ListCollectionView( _orders );
#endif
            // Track the current selection.
            this.Orders.CurrentChanged += SelectedOrderChanged;
            this.Orders.MoveCurrentTo(null);
        }

        public ICollectionView Orders { get; private set; }

        private void SelectedOrderChanged( object sender, EventArgs e )
        {
            SelectedOrder = Orders.CurrentItem as OrderPresentationModel;
            NotifyPropertyChanged( "SelectedOrder" );
        }

        public OrderPresentationModel SelectedOrder { get; private set; }

        private void PopulateOrders()
        {
            _orders = new ObservableCollection<OrderPresentationModel>();

            foreach ( Services.Order order in this.ordersRepository.GetOrdersToEdit() )
            {
                // Wrap the Order object in a presentation model object.
                var orderPresentationModel = new OrderPresentationModel( order );
                _orders.Add( orderPresentationModel );

                // Subscribe to the Save event on the individual orders.
                orderPresentationModel.Saved += this.OrderSaved;

                //TODO: 04 - Each Order Save command is registered with the application's SaveAll command.
                commandProxy.SaveAllOrdersCommand.RegisterCommand( orderPresentationModel.SaveOrderCommand );
            }
        }

        private void OrderSaved( object sender, DataEventArgs<OrderPresentationModel> e )
        {
            if (e != null && e.Value != null)
            {
                OrderPresentationModel order = e.Value;
                if ( this.Orders.Contains( order ) )
                {
                    order.Saved -= this.OrderSaved;
                    //TODO: 05 - As each order is saved, it is unregistered from the application's SaveAll command.
                    this.commandProxy.SaveAllOrdersCommand.UnregisterCommand( order.SaveOrderCommand );
                    // Remove saved orders from the collection.
                    this._orders.Remove( order );
                }
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged( string propertyName )
        {
            if ( this.PropertyChanged != null )
            {
                this.PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
            }
        }

        #endregion
    }
用户控件定义

虽然没有地方显示调用用户控件的构造函数(这都是Prism完成的工作),但是用户控件中可以直接使用定义的Model来作为数据源,在调用如下的构造函数之前会去初始化一个OrdersEditorPresentationModel对象。所以当用户控件中有好多参数的时候,Prism都会去初始化里面的参数,在调用该构造函数。

 public partial class OrdersEditorView : UserControl
    {
        public OrdersEditorView( OrdersEditorPresentationModel model )
        {
            InitializeComponent();

            // Set the presentation model as this views data context.
            DataContext = model;
        }
    }
其他代码省略

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值