Навигация по Views
На этой странице вы узнаете, как поменять view
в зоне содержимого у основного окна,
для отображения view
нового элемента, после нажатия кнопки Add Item.
До этого момента, вы использовали паттерн MVVM.
Это значит, что логическая часть приложения управляется из view models
.
Основное окно управляется из одноименной view model
.
Чтобы добавить во view model
метод для смены содержимого в основном окно, выполните следующие действия:
- Остановите ваше приложение, если оно запущено.
- В папке /ViewModels найдите файл MainWindowViewModel.cs.
- Измените код, как показано ниже.
using ReactiveUI;
using ToDoList.Services;
namespace ToDoList.ViewModels
{
public class MainWindowViewModel : ViewModelBase
{
private ViewModelBase _contentViewModel;
//this has a dependency on the ToDoListService
public MainWindowViewModel()
{
var service = new ToDoListService();
ToDoList = new ToDoListViewModel(service.GetItems());
_contentViewModel = ToDoList;
}
public ToDoListViewModel ToDoList { get; }
public ViewModelBase ContentViewModel
{
get => _contentViewModel;
private set => this.RaiseAndSetIfChanged(ref _contentViewModel, value);
}
public void AddItem()
{
ContentViewModel = new AddItemViewModel();
}
}
}
Потратьте некоторое время на изучение только что добавленного кода.
Было добавлено новое свойство ContentViewModel
, которое может получать и изменять view model
в содержимом основного окна.
Также, данное свойство инициализируется в конструкторе через сервис.
Еще добавлено новый метод AddItem()
, который меняет значение ContentViewModel
на view model
добавления нового элемента.
Обратите внимание, что изменение свойства ContentViewModel
вызывает RaiseAndSetIfChanged
,
который генерирует уведомление каждый раз при смене значения.
Система привязки Avalonia UI, требует наличия подобных уведомлений, чтобы понимать, когда обновлять пользовательский интерфейс.
Main Window Content Binding (рус: Привязка содержимого в основном окне)
Теперь, когда вы передали управление содержимым окна во view model
(в соответствии с паттерном MVVM),
необходимо закончить изменения, добавив привязку содержимого в основное окно.
Для этого выполните следующие действия:
- В папке /Views найдите файл MainWindow.axaml.
- Измините XAML как показано ниже.
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ToDoList.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="250" d:DesignHeight="450"
x:Class="ToDoList.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="Avalonia To Do List"
Content="{Binding ContentViewModel}">
</Window>
Команда кнопки
Теперь, чтобы нажатие на кнопку вызывало метод AddIten()
, выполните следующие действия:
- В папке /Views найдите файл ToDoListView.axaml.
- Измините XAML у кнопки, как показано ниже:
<Button DockPanel.Dock="Bottom"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
x:CompileBindings="False"
Command="{Binding $parent[Window].DataContext.AddItem}">
Add Item
</Button>
Потратьте некоторое время на изучение только что добавленной привязки к кнопке.
Во первых, свойство Command
определяет метод, который будет вызван при нажатии на кнопку.
Во вторых, привязка позволяет указать точный путь используемого метода через выражение:
$parent[Window].DataContext.AddItem
Binding source expression перенаправляет источник привязки.
Система привязки Avalonia UI будет использовать источник из выражения, вместо контекста данных Control
.
В данном случае, выражение ищет любой родительский Control
с типом Window
.
Затем, выражение будет использовать котекст данных найденного Control
для вызова метода AddItem
.
Подробнее о концепте привязки, см здесь.