Связь ViewModel с ViewModel обычно обрабатывается реализацией шаблона Event Aggregator.
MVVM Light использует класс Messenger
, Prism имеет другую реализацию, но в основном это один из способов передачи сообщений между моделями представления без связывания.
Есть несколько примеров и Статьи , описывающих использование.
Я бы посоветовал взглянуть на это.
Что касается контроллеров в WPF, я не знаю.
По поводу примера:
-У меня есть Windows с ее WindowsViewModel. Этот класс должен иметь команду, привязанную к кнопке.
- Пользователь нажимает кнопку. Выполняет команду.
-Команда открывает новое окно.
Здесь вы должны создать модель диалогового окна и каким-то образом создать окно. Или создайте Окно с помощью ViewModel, но ViewModel не должно много знать о представлении, в противном случае это невозможно проверить.
Мы используем что-то подобное, потому что у нас есть некоторые требования, но это
могло бы быть намного проще, это единственный пример, который у меня под рукой:
bool? ShowDialogImpl<TViewModel>(Action<TViewModel> setup) where TViewModel : ViewModel
{
return (bool?)DispatcherHelper.UIDispatcher.Invoke(
(Func<bool?>)(() =>
{
var viewModel = viewModelFactory.Get<TViewModel>();
viewModel.ViewService = this;
setup(viewModel);
var window = new Window
{
Owner = this,
SizeToContent = SizeToContent.WidthAndHeight,
WindowStartupLocation = WindowStartupLocation.CenterOwner,
Content = ViewFactory.CreateView<TViewModel>(),
DataContext = viewModel,
WindowStyle = WindowStyle.ToolWindow,
ShowInTaskbar = false
};
window.SetBinding(TitleProperty, new Binding("Title"));
openDialogs.Push(window);
window.Activated += (sender, args) => window.SizeToContent = SizeToContent.Manual;
var result = window.ShowDialog();
openDialogs.Pop();
viewModelFactory.Release(viewModel);
return result;
}));
}
В основном: мы создаем окно и модель представления.
Модель представления создается на фабрике с использованием контейнера.
Установочный делегат Action является точкой входа для наших данных.
Первая Windows это Grid, а вторая Dialog для редактирования данных сетки.
В Windows у нас есть:
messenger.Register<EntityUpdated<FooClass>>(this, message => UpdateItem(message.Entity));
А в диалоге:
messenger.Send(new EntityUpdated<FooClass>(subject));
Таким образом, мы знаем, когда что-то было обновлено в диалоге редактирования для обновления сетки.
Надеюсь, это поможет вам:)