首页 > 解决方案 > 在 WPF MVVM 模式中更改查看按钮单击

问题描述

我在 Window 的一个用户控件(usercontrol1.xaml)上有 3 个按钮。现在单击按钮 1,我想将视图切换到另一个用户控件(usercontrol2.xaml),它又有 3 个按钮,依此类推。

如何在 WPF 中实现 MVVM 模式?

标签: wpfmvvmview

解决方案


请注意,我在此示例中使用 caliburn micro

 private IEventAggregator _eventAggregator => IoC.Get<IEventAggregator>(key: nameof(EventAggregator));
        private IWindowManager _windowManager => IoC.Get<IWindowManager>(key: nameof(WindowManager));
        public ShellViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator.Subscribe(this);
        }


        public string _firstName;
        // public ShellViewModel page = new ShellViewModel();
        public string FirstName
        {
            get {       
                return _firstName;
            }
            set
            {

                _firstName = value;
                NotifyOfPropertyChange(() => FirstName);

            }
        }
        public ICommand ConvertTextCommand
        {
            get { return new DelegateCommand(ConvertText); }
        }

        void ConvertText()
        {
            //string url = "https://www.google.com/";
            string url = FirstName;
             string result;
             using (HttpClient client = new HttpClient())
             {
                 using (HttpResponseMessage response = client.GetAsync(url).Result)
                 {
                     using (HttpContent content = response.Content)
                     {
                          result = content.ReadAsStringAsync().Result;
                     }
                 }
             }
             //(MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";
             //Application.Current.Resources.Add("PageSource", result);
             // NavigationService.NavigateToViewModel<SecondViewModel>("Hello");
             _windowManager.ShowWindow(new PageSourceViewModel(_eventAggregator), null);
             _eventAggregator.PublishOnUIThread(result);

        }


您可以检查 caliburn micro 并查看您可以在窗口管理器实例中创建一个新的视图模型

这里还有 2 个指向 2 个教程的链接,它们帮助我为 MVVM 解决了这个问题

https://www.youtube.com/watch?v=laPFq3Fhs8k

https://www.youtube.com/watch?v=9kGcE9thwNw&list=LLy8ROdSzpPJnikdZQ1XPZkQ&index=30&t=0s

第一个教程将帮助您大致了解。第二个将帮助您处理事件,您可以回顾我的代码,看看我是如何处理新窗口实例的。

您还可以像问题中所说的那样为同一窗口的新实例调用相同的视图模型

您还需要创建一个 boostrapper 类。对于我的例子,我是这样做的。

public class Bootstrapper : BootstrapperBase
    {

        private readonly SimpleContainer _container =
            new SimpleContainer();
        public Bootstrapper()
        {
            Initialize();
        }

        protected override void Configure()
        {
            _container.Instance<IWindowManager>(new WindowManager());
            _container.Singleton<IEventAggregator, EventAggregator>();
            _container.PerRequest<ShellViewModel>();
        }
        protected override void OnStartup(object sender, StartupEventArgs e)
        {

            _container.Instance<SimpleContainer>(_container);

            _container.Singleton<IWindowManager, WindowManager>(key: nameof(WindowManager))
                .Singleton<IEventAggregator, EventAggregator>(key: nameof(EventAggregator));
            DisplayRootViewFor<ShellViewModel>();



        }


        protected override object GetInstance(Type service, string key)
        {
            return _container.GetInstance(service, key);
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return _container.GetAllInstances(service);
        }

        protected override void BuildUp(object instance)
        {
            _container.BuildUp(instance);
        }


    }

推荐阅读