2010-02-11 3 views
3

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

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

образец:

private ICommand _printCommand; 

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

     return _printCommand; 
    } 
} 

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

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

Для примера: , когда пользователь щелкает печатью, выполняется команда печати Печать метод, который будет публиковать событие печати. Это событие будет подано на 20 просмотров и продолжит обработку.

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

+0

Вы хотите, чтобы все виды печати или только текущий вид, например, вид с фокусом ввода? –

+0

Для печати, я хотел бы напечатать представление с фокусом ввода. Но для сохранения и расширения он должен применяться ко всем представлениям – Praveen

ответ

0

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

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

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

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

2

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

Ex: Приложение поддерживает 40 просмотров Основная область -> 20 Виды, которые являются активными, все модели представлены на основе baseviewmodel.

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

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

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

+0

Да, в этом случае вы хотели бы использовать команду рядом с составной командой. Посмотрите на образцы призмы для одного с «Сохранить/Сохранить все». Я не помню, какой он есть, но я думаю, что это то, что вы ищете. Он использует регулярную команду для сохранения и составной команды для сохранения всех. Кроме того, если у вас есть ответ на ответ, используйте функцию «Комментарии» или обновите свой ответ, а не отправляйте другой ответ. –

1

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

2

Если приложение позволяет выполнять несколько команд одновременно, мы можем разрешить пользователю сохранять все элементы на разных вкладках, используя одну команду, представленную кнопкой ленты. В этом случае команда Save All будет вызывать каждую из команд Save, реализованных экземпляром модели представления для каждого элемента. В биржевом трейдере RI, например, команды 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; } 
    } 
} 
Смежные вопросы