Использование команд viewmodel для открытия новых вкладок - PullRequest
1 голос
/ 20 февраля 2012

У меня есть приложение, в котором у меня есть основная модель представления, представление которой содержит tabcontrol, где каждая вкладка имеет свой собственный вид и модель представления (и, возможно, их больше).Я считаю, что это довольно распространенный дизайн.Теперь я хочу открыть новые вкладки (создав новые экземпляры моделей и добавив их в коллекцию рабочих пространств), запустив команды из элементов управления внутри этих вкладок.Проблема в том, что команда получена внутренней моделью представления, которая управляет вкладкой, а не внешней, которая управляет управлением вкладкой.Какова была бы лучшая практика, чтобы сделать это?Все решения, которые я могу придумать, являются «хакерскими» (давая viewmodel ссылку на его родительскую viewmodel, подписку на событие потомка от родителя ...).Я предполагаю, что есть хорошее решение для этого.

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

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Одна возможность состоит в том, чтобы ваша внешняя модель представления выставила команду для создания новой вкладки. Мы используем централизованный CommandService, который представляет собой просто словарь name-to-ICommand, который позволяет разделить глобальные команды. Примерно так:

public interface ICommandService
{
    void RegisterCommand(string name, ICommand command);
    ICommand this[string name] {get;}
}

public class OuterViewModel
{
    public OuterViewModel (ICommandService commandService)
    {
        commandService.RegisterCommand("OpenNewTab", OpenNewTab);
    }

    private void OpenNewTab (object newTabViewModel)
    {
         // The new tab's viewmodel is sent as the ICommand's CommandParameter
    }
}

public class InnerViewModel
{
    public InnerViewModel (ICommandService commandService)
    {
        _commandService = commandService; // Save injected service locally.
    }

    public HandleClickOnInnerTabpage()
    {
         AnotherViewModel newVM = new AnotherViewModel(...);
         _commandService["OpenNewTab"].Execute(newVM);
    }
}
1 голос
/ 20 февраля 2012

Вы можете использовать либо стандартные события .NET (подписка на дочерние события в родительском), либо для большей развязки использовать шаблон агрегатора событий.

Фреймворки, такие как Prism и Caliburn.Micro реализуют шаблон агрегатора событий, а MVVM Light Toolkit предоставляет класс Messenger для той же цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...