Я использую Легкий инструментарий 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
Передача сообщения от 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();
}
}
}
Если я здесь не упущу суть - если бы я использовал код, стоящий за ним, то почему бы напрямую не реализовать событие button_click и не открыть второе представление?
Кажется, Bugnion предлагает следующее: view1 -> нажатие кнопки -> команда реле -> viewmodel1 -> message -> view1 -> view1.cs -> open view 2.
В любом случае вы собираетесь пожертвовать тестируемостью, написание кода программной части, так зачем же идти таким длинным путем?