Я не уверен, что это стандартный способ создания составных представлений, но я добился определенного успеха в определении главного представления (в моем случае Window
), которое содержит общие элементы управления, необходимые для семейства представленийи добавление различных UserControl
для каждого отдельного вспомогательного представления в мастер с использованием ContentControl
в качестве эквивалента ContentPlaceholder
на главной странице ASP.NET.В моем случае я определил интерфейс, который реализуют все вложенные представления:
public interface ISubView
{
BaseViewModel ViewModel { get; set; }
}
Это позволяет моему ApplicationController
помещать модель представления в дочернее представление при обработке запроса, чтобы показать конкретное представление.,Подэпидем затем составляется с основным видом через свойство setter на главном представлении перед его отображением.
ApplicationController
- это класс, который централизует задачи открытия и закрытия представлений;всякий раз, когда что-либо в приложении хочет показать конкретное представление, оно запрашивает ApplicationController
.Когда он получает запрос на показ определенного представления, он ищет и создает соответствующий подвид и подкласс модели представления из внутреннего «реестра» и компонует части вместе.При запуске приложения вы создаете ApplicationController
и регистрируете комбинации подкласса ViewModel и подкласса View.Частичный пример реализации:
public class ApplicationController
{
private IDictionary<string, Tuple<Func<ISubView>, Func<BaseViewModel>> _registry;
private Func<IShellWindow> _shellActivator;
public ApplicationController(Func<IShellWindow> shellActivator)
{
_registry = new Dictionary<string, Tuple<Func<ISubView>, Func<BaseViewModel>>();
_shellActivator = shellActivator;
}
public void RequestShow(string viewName)
{
var shell = _shellActivator();
var viewToModel = _registry[viewName];
var view = viewToModel.Item1();
var viewModel = viewToModel.Item2();
view.ViewModel = viewModel;
shell.Display(view);
}
public Register(string name, Func<ISubView> subViewCreator, Func<ViewModel> viewModelCreator)
{
_registry.Add(name, new Tuple(subViewCreator, viewModelCreator));
}
}
В методе оболочки Display
(определенном в интерфейсе IShellView) вы бы сделали что-то вроде:
public void Display(ISubView view)
{
contentHolder.Content = view;
DataContext = view.ViewModel;
Show();
}
Запуск приложениябудет включать в себя что-то вроде:
var appController = new ApplicationController(() => new ShellWindow());
appController.Register("EmployeesReport", () => new EmployeesReportView(), () => new EmployeesReportViewModel);
appController.Register("OrdersReport", () => new OrdersReportView(), () => new OrdersReportViewModel());
//etc.