The View Locator
На этой странице вы узнаете, для чего используется view locator
, который был добавлен из шаблона решения.
Вы увидите, как реализуется парадигма 'Соглашения по конфигурации' внутри
содержимого вашего основного окна.
Для понимания, как это работает, ознакомьтесь с классом view locator
:
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using System;
using ToDoList.ViewModels;
namespace ToDoList
{
public class ViewLocator : IDataTemplate
{
public Control Build(object data)
{
var name = data.GetType().FullName!.Replace("ViewModel", "View");
var type = Type.GetType(name);
if (type != null)
{
return (Control)Activator.CreateInstance(type)!;
}
else
{
return new TextBlock { Text = "Not Found: " + name };
}
}
public bool Match(object data)
{
return data is ViewModelBase;
}
}
}
Класс view locator
определяет шаблон данных в коде, который принимает view model
и возвращает соответствующую view
.
Это работает благодаря двум метода:
Match(object data)
проверяет, что вашиview model
наследуются от классаViewModelBase
- как это и делают обе вашиview models
! При усмушном прохождении проверки, вызывается методBuild
:Build(object data)
принимает полное имя вашейview model
, и заменяет ее часть"ViewModel"
на"View"
. Затем он пытается создать типview
и, в случае успеха, возвращает его.
Экземпляр ViewLocator
находит внутри файла проекта App.xaml (он был добавлен шаблоном решения).
Он выглядит примерно так:
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ToDoList.App"
xmlns:local="using:ToDoList"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
<Application.DataTemplates>
<local:ViewLocator/>
</Application.DataTemplates>
<Application.Styles>
<FluentTheme />
</Application.Styles>
</Application>
В вашем приложении списка дел, содержимое основного окна указывает на объект, который не является встроенным control
,
user control
или пользовательским control
.
Поэтому Avalonia UI ищет data template (рус: шаблон данных) в дереве controls
, который соответствует классу в содержимом основного окна.
Подробнее о концепте data templates (рус: шаблоны данных)
, см здесь.
Поскольку никаких других data templates (рус: шаблонов данных) нет, то поиск укажет на ViewLocator
- элемент data templates
приложения.
Он запустит свои проверки и, в случае успеха, веренет соответствующий экземпляр view
.
В вашем приложении, это будет view
списка дел.
Таким образом, содержимому основного окна присваивается нужная view
, согласно типу view model
и соглашения об именовании.
Source not Framework
Обратите внимание, что класс View Locator
, включен в исходники проекта, и не является часть фреймворка Avalonia UI.
Это связано с тем, что парадигма 'Соглашение по конфигурации', является архитектурным выбором разработчика прилоежения.
Поэтому, если вы не ходите использовать view locator
(в другом приложении), то удалит его из проекта и файла App.axaml.
На следующей странице вы узнаете, как добавить функкционал и события для кнопок OK и Cancel.