Настройка команд WPF из нескольких моделей представлений - PullRequest
3 голосов
/ 06 мая 2010

Как и в любом приложении MVVM WPF, у меня есть несколько моделей представлений. У каждого есть несколько команд. В моем представлении реализован пользовательский интерфейс Fluent (лента Office), поэтому некоторые элементы отображаются в зависимости от контекста приложения. Лента детская к основному приложению.

Основная структура моего приложения состоит в том, что оно управляет курсом. В КУРСЕ есть несколько МОДУЛЕЙ, поэтому у меня есть ВМ для курса и модуля ... и у каждого есть команды.

Когда приложение загружается, я устанавливаю контекст данных главного окна на курс, чтобы привязка команд курса к ленте была простой и работала нормально.

Задача возникает, когда пользователь начинает работать с модулем. Когда модуль выбран из списка, детали отображаются в другом пользовательском элементе управления. Теперь ... моя задача - как соединить команды с лентой.

Я предполагаю, что мог бы иметь какой-то обработчик событий, который программно соединяет команды текущего модуля со всеми соответствующими элементами управления на ленте и удаляет все, когда контекст исчезает. Но это кажется большой ненужной работой. Есть ли более чистый способ сделать это?

Я думал о перенаправленных командах / событиях, но кто-то сказал мне, что это не сработает, потому что они не будут все пузыри подниматься к окну и обратно на ленту.

Ищите здесь какое-то руководство ... Я немного новичок в MVVM (но мне это нравится!).

1 Ответ

4 голосов
/ 08 мая 2010

Идея: Ввести класс ShellCommands, который предоставляется как сервис.

public class ShellCommands : IShellCommands
{
    public ICommand SaveCommand { get; set; }
    ...
}

Тогда CourseViewModel и ModuleViewModel могут использовать один и тот же сервис для регистрации своих команд.

public class CourseViewModel : ViewModel 
{
    public CourseViewModel(IShellCommands shellCommands, ...)
    {
        this.ShellCommands = shellCommands;
        ...
    }

    public IShellCommands ShellCommands { get; private set; }
}

В XAML вы можете получить доступ к сервису через свойство ShellCommands.

<MenuItem Header="Save" Command="{Binding ShellCommands.SaveCommand}"/>

.

Дополнительная информация: WPF Application Framework (WAF)

...