Как открыть новое окно с помощью Инструментария Света MVVM

Я использую Легкий инструментарий MVVM в своем приложении WPF. Я хотел бы знать то, что является лучшим подходом для открытия нового окна из существующего окна. У меня есть это MainViewModel, который ответственен за MainWindow из моего приложения. Теперь в MainView, на нажатии кнопки я хотел бы открыть второе окно сверху его. Я имею RelayCommmand связанный с Button Command. В RelayCommandметод, я могу создать новый объект окна и просто звонить Show(), что-то вроде этого:

var view2 = new view2()
view2.Show()

но я не думаю, что ViewModel должен быть ответственен за создание нового view2 объект. Я прочитал это сообщение, WPF MVVM Получает Родителя из МОДЕЛИ ПРЕДСТАВЛЕНИЯ, где Bugnion предложил передать сообщение view1 от viewmodel1 и затем view1 должен создать новое view2. Но я не уверен, что он на самом деле подразумевает под передачей сообщения к view1? Как должен view1 обработать сообщение? В он - код позади или что?

С уважением, Nabeel

46
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Передача сообщения от ViewModel1 к View1 означает использование возможностей обмена сообщениями в MVVM Light Toolkit .

Например, ваша ViewModel1 может иметь команду под названием ShowView2Command, тогда она отправит сообщение для отображения представления.

public class ViewModel1 : ViewModelBase
{
    public RelayCommand ShowView2Command { private set; get; }

    public ViewModel1() : base()
    {
        ShowView2Command = new RelayCommand(ShowView2CommandExecute);
    }

    public void ShowView2CommandExecute()
    {
        Messenger.Default.Send(new NotificationMessage("ShowView2"));
    }
}

View1 будет регистрироваться для получения сообщений в своем коде и отображать View2, когда получит правильное сообщение.

public partial class View1 : UserControl
{
    public View1()
    {
        InitializeComponent();
        Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
    }

    private void NotificationMessageReceived(NotificationMessage msg)
    {
        if (msg.Notification == "ShowView2")
        {
            var view2 = new view2();
            view2.Show();
        }
    }
}
56
ответ дан 26 November 2019 в 20:34
поделиться

Если я здесь не упущу суть - если бы я использовал код, стоящий за ним, то почему бы напрямую не реализовать событие button_click и не открыть второе представление?

Кажется, Bugnion предлагает следующее: view1 -> нажатие кнопки -> команда реле -> viewmodel1 -> message -> view1 -> view1.cs -> open view 2.

В любом случае вы собираетесь пожертвовать тестируемостью, написание кода программной части, так зачем же идти таким длинным путем?

2
ответ дан 26 November 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: