составная команда призмы wpf - PullRequest
3 голосов
/ 11 февраля 2010

У меня есть составное приложение WPF. Я планирую реализовать функциональность панели инструментов. Есть несколько элементов панели инструментов (в основном печать, сохранение, скрытие, расширение, отмена), которые будут общими для всех представлений в основном регионе. Для этого я создал модуль панели инструментов по умолчанию, который будет добавлять эти элементы (печать, сохранение, скрытие, расширение, отмена) в область панели инструментов. когда пользователь щелкает по любому элементу панели инструментов, это должно обрабатываться всеми 20 представлениями в основном регионе.

Для каждого элемента панели инструментов я связал объект команды Prism Delegate.

образец:

private ICommand _printCommand;

public ICommand PrintCommand
{
    get
    {
        if (_printCommand == null)
        {
            _printCommand = 
                new DelegateCommand<object>(**Print**, **CanPrint**);                    
        }

        return _printCommand;
    }
}

Xaml, привязать элемент панели инструментов к этой команде.

В основном регионе мы показываем около 20 просмотров. Все эти представления должны подчиняться этой команде. Я думаю об использовании агрегатора событий для публикации события, и все представления будут подписываться на это событие.

Например: когда пользователь нажимает кнопку print, команда print выполняет метод Print , который опубликует событие печати. Это событие будет подписано 20 представлениями и выполнено дальнейшая обработка.

Правильно ли я реализую панель инструментов?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

Если приложение позволяет пользователю выполнять несколько команд одновременно, мы можем разрешить пользователю сохранять все элементы на разных вкладках, используя одну команду, представленную кнопкой ленты. В этом случае команда «Сохранить все» вызовет каждую из команд «Сохранить», реализованную экземпляром модели представления для каждого элемента. Например, в RI Stock Trader команды Submit и Cancel для каждого ордера на покупку / продажу регистрируются с помощью составных команд SubmitAllOrders и CancelAllOrders, как показано в следующем примере кода (см. Класс OrdersController).

commandProxy.SubmitAllOrdersCommand.RegisterCommand(
                    orderCompositeViewModel.SubmitCommand );
commandProxy.CancelAllOrdersCommand.RegisterCommand(
                    orderCompositeViewModel.CancelCommand );

Предыдущий объект commandProxy обеспечивает доступ экземпляра к составным командам Submit и Cancel, которые определены статически. Для получения дополнительной информации см. Файл класса StockTraderRICommands.cs.

public class MyViewModel : NotificationObject
{
    private readonly CompositeCommand saveAllCommand;

    public ArticleViewModel(INewsFeedService newsFeedService,
                            IRegionManager regionManager,
                            IEventAggregator eventAggregator)
    {
        this.saveAllCommand = new CompositeCommand();
        this.saveAllCommand.RegisterCommand(new SaveProductsCommand());
        this.saveAllCommand.RegisterCommand(new SaveOrdersCommand());
    }

    public ICommand SaveAllCommand
    {
        get { return this.saveAllCommand; }
    }
}
2 голосов
/ 12 февраля 2010

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

Пример: приложение поддерживает 40 просмотров Основной регион -> 20 видов, которые активны, все модели видов получены из baseviewmodel.

панель инструментов -> кнопка сохранения -> привязка данных к композитам со всеми командами (активированный монитор включен) baseviewmodel -> команда save -> регистрирует / отменяет регистрацию в зависимости от определенных условий фильтрации для композитов saallcommand

когда пользователь нажимает кнопку сохранения, compositesaveallcommand ищет все зарегистрированные активные команды и проверяет все зарегистрированные вызовы команд viewmodel (метод canexecute, а все зарегистрированные команды должны возвращать true), затем вызывает дочерние команды (метод execute).

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

1 голос
/ 19 февраля 2010

Это именно то, что делает CompositeCommand. Я полагаю, что примеров нет (Commanding QuickStart или RI больше не показывают активную осведомленную активность, как в Prism v1), но если вы используете активную осведомленную информацию, вы получите то, что просите. Единственное, что вам нужно, это убедиться, что каждая из отдельных DelegateCommands правильно обновляет свое свойство IsActive, когда они должны (т.е. когда активируется представление).

0 голосов
/ 12 февраля 2010

Мне не очень нравится идея использовать EventAggregator слишком сильно для подобных вещей. Особенно, если вы решили создать интерфейс многодокументного редактора, каждый из ваших редакторов будет нести ответственность за большую фильтрацию, чтобы получить события, которые подходят только им.

Для этой цели может быть легко использовать EventAggregator, но я думаю, что он, вероятно, не совсем подходит. Тем не менее, это не совсем неправильно ... на самом деле, я считаю, что некоторые из примеров Prism делают именно это, но я думаю, что это накладывает слишком большую ответственность на компоненты для фильтрации, а не на использование возможностей фреймворка.

Ваш субъект предлагает вам подумать об использовании CompositeCommands для этого. Есть ли причина, по которой вы не делаете это вместо использования EventAggregator? Если бы у вас было стандартное место, где ViewModels могли зарегистрировать свои Команды, предназначенные для обработки каждой из этих кнопок, с составной командой, расположенной позади каждой, разве это не дало бы вам ту функциональность, которую вы хотели? В дополнение к возможности обрабатывать команды кнопок, каждый из составляющих видов / моделей представления мог бы отключать кнопки, когда они были неуместны и т. Д.

Внимательно посмотрите образцы CompositeCommand в документации Prism и посмотрите, не выполняют ли они то, что вам нужно.

...