Это отличный вопрос - у меня были похожие вопросы, когда я начал использовать MVVM.Я использую только библиотеки Prism / CAL от MS.
Я считаю, что вам нужна идея Region в CAL.Это в основном именованный контейнерный элемент управления, который представляет вещи.По сути, вы называете регион в пользовательском интерфейсе верхнего уровня, например, в главном окне.Ваше приложение, вероятно, имеет небольшое количество из них: возможно, верхний и нижний колонтитулы и области основного окна.(Вот как я это сделал в любом случае.)Затем из кода вы можете получить доступ к региону через менеджера региона, очистить его и вставить в свою ViewModel.ViewModel сопоставляется с соответствующим View, и вуаля появляется новый View.
С точки зрения кодирования, я обычно видел, как он разбивается следующим образом: у вас есть своего рода NavigationController, у которого есть метод или дваот очистки региона и отображения нового ViewModel-> View, а также имеет методы, такие как GoToPageX ().Это реферат регионального менеджера.Тогда у вас есть ViewModel для каждой страницы и View для каждой страницы.Каждый ViewModel принимает NavigationController через внедрение зависимостей (но вы можете создавать новые, если вы не используете DI).Затем в ViewModel он предоставляет Команду, которая отображается на кнопку и вызывает NavigationController.
Где-то вы также должны зарегистрировать ViewModels с помощью представлений, используемых для их отображения.
Вот пример NavigationController:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Prism.Regions;
using Microsoft.Practices.Unity;
using KSheets.CoreModule.Presenter;
using Zephyr.Core.Logging;
using KSheets.CoreSheets.Sheet;
using System.IO;
namespace KSheets.CoreModule.Switch
{
public class Switchboard : ISwitchboard
{
private ILoggingService<ISwitchboard> m_Logger;
private IRegionManager m_RegionManager;
private IUnityContainer m_UnityContainer;
public Switchboard(
ILoggingService<ISwitchboard> loggingService,
IRegionManager regionManager,
IUnityContainer unityContainer
)
{
if (loggingService == null) throw new ArgumentNullException("loggingService");
if (regionManager == null) throw new ArgumentNullException("regionManager");
if (unityContainer == null) throw new ArgumentNullException("unityContainer");
m_RegionManager = regionManager;
m_UnityContainer = unityContainer;
m_Logger = loggingService;
}
public void GoHome()
{
m_Logger.Log("Going home");
var worksheetEditor = m_UnityContainer.Resolve<IWorksheetEditor>();
worksheetEditor.Initialize();
LoadView(RegionNames.EditorRegion, worksheetEditor);
var batchExporter = m_UnityContainer.Resolve<IExportBatchPresenter>();
LoadView(RegionNames.ExporterRegion, batchExporter);
}
private void LoadView(string regionName, object newView)
{
var region = m_RegionManager.Regions[regionName];
var oldViews = region.Views;
foreach (var oldView in oldViews)
region.Remove(oldView);
region.Add(newView);
region.Activate(newView);
}
}
}
Вот пример регистрации View с помощью ViewModel программно.Многие люди делают это в XAML, но вы также можете делать это в коде, который работает в IMO лучше, если вы используете внедрение зависимостей, так как вы можете регистрировать свои представления и все свои элементы внедрения зависимостей одновременно при загрузке модуля.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
namespace Zephyr.WPF.Utils
{
public static class ResourceUtils
{
public static void RegisterView<T, U>()
{
DataTemplate template = new DataTemplate();
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(U));
template.DataType = typeof(T).FullName;
template.VisualTree = factory;
Application.Current.Resources.Add(new DataTemplateKey(typeof(T)), template);
}
}
}
private void RegisterViews()
{
ResourceUtils.RegisterView<WorksheetDisplay, WorksheetDisplayView>();
ResourceUtils.RegisterView<ProblemSelector, ProblemSelectorView>();
ResourceUtils.RegisterView<WorksheetEditor, WorksheetEditorView>();
ResourceUtils.RegisterView<ExportBatchPresenter, ExportBatchView>();
}
В конце дня вам понадобится небольшой кусочек кода, который осведомлен о пользовательском интерфейсе (или элемент управления пользовательского интерфейса, который прослушивает сообщения, отправленные из не-пользовательского кода, который знает маленький бит опользовательский интерфейс любит имена регионов) и позволяет вам приклеить ViewModel на место.Тем не менее, этот код обычно очень минималистичен и определенно не требует никакого кода, кроме готовых компонентов.MVVM - это что-то особенное, когда вам действительно нужно впервые реализовать его в WPF;крутая кривая обучения для запуска и запуска простого приложения.