MVVM - События
Событие - это программная конструкция, которая реагирует на изменение состояния, уведомляя любые конечные точки, которые зарегистрировались для уведомления. В первую очередь, события используются для информирования пользователя, вводимого с помощью мыши и клавиатуры, но их полезность не ограничивается этим. Каждый раз, когда обнаруживается изменение состояния, например, когда объект загружен или инициализирован, может быть инициировано событие, чтобы предупредить любые заинтересованные третьи стороны.
В приложении WPF, которое использует шаблон проектирования MVVM (Model-View-ViewModel), модель представления - это компонент, который отвечает за обработку логики и состояния представления приложения.
Файл кода программной части представления не должен содержать кода для обработки событий, возникающих из любого элемента пользовательского интерфейса (UI), такого как Button или ComboBox, и не должен содержать никакой логики, специфичной для домена.
В идеале код программной части представления содержит только конструктор, который вызывает метод InitializeComponent и, возможно, некоторый дополнительный код для управления или взаимодействия со слоем представления, который трудно или неэффективно выразить в XAML, например сложные анимации.
Давайте посмотрим на простой пример событий нажатия кнопки в нашем приложении. Ниже приведен код XAML файла MainWindow.xaml, в котором вы увидите две кнопки.
<Window x:Class = "MVVMHierarchiesDemo.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:MVVMHierarchiesDemo"
xmlns:views = "clr-namespace:MVVMHierarchiesDemo.Views"
xmlns:viewModels = "clr-namespace:MVVMHierarchiesDemo.ViewModel"
mc:Ignorable = "d"
Title = "MainWindow" Height = "350" Width = "525">
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType = "{x:Type viewModels:CustomerListViewModel}">
<views:CustomerListView/>
</DataTemplate>
<DataTemplate DataType = "{x:Type viewModels:OrderViewModel}">
<views:OrderView/>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition Height = "*" />
</Grid.RowDefinitions>
<Grid x:Name = "NavBar">
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "*" />
</Grid.ColumnDefinitions>
<Button Content = "Customers"
Command = "{Binding NavCommand}"
CommandParameter = "customers"
Grid.Column = "0" />
<Button Content = "Order"
Command = "{Binding NavCommand}"
CommandParameter = "orders"
Grid.Column = "2" />
</Grid>
<Grid x:Name = "MainContent" Grid.Row = "1">
<ContentControl Content = "{Binding CurrentViewModel}" />
</Grid>
</Grid>
</Window>
Вы можете видеть, что свойство кнопки Click не используется в приведенном выше файле XAML, но свойства Command и CommandParameter используются для загрузки различных представлений при нажатии кнопки. Теперь вам нужно определить реализацию команд в файле MainWindowViewModel.cs, а не в файле View. Ниже приводится полная реализация MainWindowViewModel.
using MVVMHierarchiesDemo.ViewModel;
using MVVMHierarchiesDemo.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MVVMHierarchiesDemo {
class MainWindowViewModel : BindableBase {
public MainWindowViewModel() {
NavCommand = new MyICommand<string>(OnNav);
}
private CustomerListViewModel custListViewModel = new CustomerListViewModel();
private OrderViewModel orderViewModelModel = new OrderViewModel();
private BindableBase _CurrentViewModel;
public BindableBase CurrentViewModel {
get { return _CurrentViewModel; }
set { SetProperty(ref _CurrentViewModel, value); }
}
public MyICommand<string> NavCommand { get; private set; }
private void OnNav(string destination) {
switch (destination) {
case "orders":
CurrentViewModel = orderViewModelModel;
break;
case "customers":
default:
CurrentViewModel = custListViewModel;
break;
}
}
}
}
Получите все свои модели представления из класса BindableBase. Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий результат.
Как видите, мы добавили только две кнопки и CurrentViewModel в наш MainWindow. Теперь, если вы нажмете любую кнопку, он перейдет к этому конкретному представлению. Нажмите кнопку «Клиенты», и вы увидите, что отображается CustomerListView.
Мы рекомендуем вам выполнить приведенный выше пример пошаговым методом для лучшего понимания.