代码之家  ›  专栏  ›  技术社区  ›  Raj

prism2/mvvm从视图模型关闭视图

  •  5
  • Raj  · 技术社区  · 15 年前

    如何从视图模型关闭视图?

    我有一个WPF窗口,它定义了多个区域,并被用作我的应用程序的宿主视图的外壳。我希望有一个视图能够将自己从该区域中移除,或者将其从选项卡式容器中关闭。如何从ViewModel中完成此行为。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Jeremiah Morrill    15 年前

    这真的取决于你的应用架构,但下面是我如何使用Prism。

    首先我想说的是 好啊 要让您的虚拟机引用该视图,只要它不是该视图的具体实现,即按接口引用。

    我使用依赖注入来结合视图和视图模型,这与在StockTraderri中所做的非常相似。所以我有一个iView和一个iView模型。iviewModel有一个类型为iview的名为“view”的属性。

    从与您的区域一起工作的代码层(对于我来说,通常是控制器…请参阅stocktraderri),添加从区域中移除视图的机制。

    例如:

    myRegion.Remove(myIViewModel.View);
    

    如果区域由控制器处理,您可能希望在虚拟机上放置一个简单事件,以便在虚拟机希望“关闭”时发出通知。如果希望使用弱事件模型,也可以使用IEventAggregator进行试验。如果区域是在虚拟机中处理的,只需在那里添加代码。

        2
  •  7
  •   Julien Poulin    15 年前

    自从你 ViewModel 没有(也不应该)提到 View ,不能直接关闭。但是,您可以做的是添加 Event 在你 视图模型 表示它想要关闭。

    乔希·史密斯写过 an article 演示如何执行此操作(大约在文章的一半)。

        3
  •  3
  •   Raj    15 年前

    我的登录模块如下所示:

        public class LoginModule : IModule
    {
        private readonly IUnityContainer container;
    
        public LoginModule(IUnityContainer container)
        {
            this.container = container;
        }
    
        #region IModule Members
    
        public void Initialize()
        {
            this.container.RegisterType<ILoginController, LoginController>(new ContainerControlledLifetimeManager());
            this.container.RegisterType<ILoginView, LoginView>();
            this.container.RegisterType<ILoginViewModel, LoginViewModel>();
    
            ILoginController controller = this.container.Resolve<ILoginController>();
            controller.Run();
        }
    
        #endregion
    }
    

    这是控制器:

        public class LoginController : ILoginController
    {
        private readonly IRegionManager regionManager;
        private readonly ILoginViewModel model;
    
        public LoginController(IRegionManager regionManager, ILoginViewModel model)
        {
            this.regionManager = regionManager;
            this.model = model;
            model.RequestClose += new EventHandler(model_RequestClose);
        }
    
        void model_RequestClose(object sender, EventArgs e)
        {
            regionManager.Regions["LoginRegion"].Remove(model.View);
        }
    
        #region ILoginController Members
    
        public void Run()
        {
            // Register views here
            regionManager.Regions["LoginRegion"].Add(model.view);
        }
    
        #endregion
    }
    

    这是我的视图模型:

        public class LoginViewModel : ViewModelBase, ILoginViewModel
    {
        IEventAggregator _eventAggregator;
        RelayCommand _loginCommand;
        private readonly UserProfileRepository _userProfileRepository;
        public event EventHandler RequestClose;
    
        public ICommand LoginCommand
        {
            get
            {
                if (_loginCommand == null)
                {
                    _loginCommand = new RelayCommand(
                        param => this.Login(),
                        param => this.IsValid());
                }
                return _loginCommand;
            }
        }
    
        public LoginViewModel(IEventAggregator eventAggregator, UserProfileRepository userProfileRepository, ILoginView view)
        {
            this._eventAggregator = eventAggregator;
            this._userProfileRepository = userProfileRepository;
            this.View = view;
        }
    
        #region ILoginViewModel Members
    
        public ILoginView View { get; private set; }
    
        #endregion
    }