Изменить вид на кнопку Нажмите в WPF MVVM Pattern - PullRequest
0 голосов
/ 04 марта 2020

У меня 3 кнопки на одном пользовательском контроле (usercontrol1.xaml) в окне. Теперь по нажатию кнопки 1 я хочу переключить представление на другой пользовательский контроль (usercontrol2.xaml), который снова имеет 3 кнопки и т. Д.

Как реализовать шаблон MVVM в WPF?

1 Ответ

0 голосов
/ 04 марта 2020

Имейте в виду, что я использую 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);
        }


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...