2013-07-01 2 views
0

Я хотел бы попросить вас совета.WPF Привязать разные команды к кнопке/menuitem

Приложение, в котором я работаю, имеет docking control и должно поддерживать работу с различными «документами». Поэтому одновременно может открываться несколько windows (вкладки).

Каждый из них может содержать различное содержимое. «Документы», которые я упоминал, могут быть текстовым файлом, листом стиля excel или основным элементом управления, разрабатываемым этим приложением (визуализация географических данных).

Я использую шаблон MVVM и библиотеку MVVM Light. Примечание. У меня есть сторонний элемент управления для таблиц Excel.

Теперь у меня есть menu bar и toolbar, где у меня есть общий menuitemsmenubar)/кнопки (в toolbar), как «сохранить», «вырезать», «копировать» и т.д ... При переключении между между вкладками , кнопка «сохранить» должна вызывать соответствующие функции сохранения.

То же самое касается и вырезать/копировать/вставить:

  • Когда на вкладке с текстом документа - вырезать/копировать/вставить, должен работать с текстом (есть МОФ встроенные команды для этого).

  • Когда в главном управления - Он должен работать с графическими элементами (у меня будет реализовывать эти)

  • Когда в электронной таблице - Он должен работать с приложенными командами третьих сторон для управления электронных таблиц.

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

С спасти command я могу представить один из возможных способов сделать это, но все же, я не уверен, является ли это хороший способ ее реализации: Есть RelayCommand в MainWindowViewModel

public ICommand SaveCommand 
{ 
    get 
    { 
     if (_saveCommand == null) 
     { 
      _saveCommand = new RelayCommand(() => this.SaveFile()); 
     } 
     return _saveCommand; 
    } 
} 

и SaveFile() метод мог бы вызвать некоторый другой «метод сохранения» на вкладке datacontext вкладки selected (которая была бы моделью просмотра для соответствующего типа документа).

Однако я не знаю, как сделать включение/выключение кнопки save/menuitem, и я не знаю, как достичь различных функций cut/copy/paste.

Приносим извинения за длительность вопроса. Может быть, я мог бы только что спросил:

«Как вы привязываете разные команды вырезания/копирования/вставки к кнопкам в зависимости от того, какая часть приложения выбрана/активна?».

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

+1

Я бы сделал, чтобы MainViewModel сохранил коллекцию других режимов просмотра и добавил свойство для текущей выбранной модели viewmodel. Затем команда save просто переадресовывает вызовы в текущие выбранные режимы отображения save command/method. – keft

ответ

2

и метод SaveFile() назвал бы какой-то другой «сохранить метод» на DataContext выбранной вкладки (который был бы ViewModel для по типу «документ»).

SaveFile должен быть реализован ViewModel без возврата к представлению.

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

Метод CanExecute команды может использоваться View для того, чтобы решить, должен ли элемент меню или кнопка быть включена. Все, что вам нужно, это реализовать метод CanExecute в ViewModel. В большинстве случаев CanExecute команды Save использует свойство IsDirty или аналогичное свойство.

EDIT

пунктов меню, которые должны быть контекст/активная вкладка пункт известно, вы можете создать основной ViewModel с командами для меню и коллекция ViewModels (по одному для каждой вкладки элемента)

В обработчиках команд контекстно-зависимых пунктов меню появляется активный ViewModel и передается команда.

Чтобы получить текущий TabItem, привяжите SelectedItem к свойству основного ViewModel (тип свойства может быть базовым классом ViewModels).

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

+0

Когда datacontext представления (выбранная вкладка) является соответствующей моделью просмотра (один тип для каждого типа документа), тогда я не понимаю, где код возвращается к представлению? Что вы имеете в виду? В viewmodel мне нужно как-то узнать, какая вкладка выбрана. Единственный способ, которым я смог это сделать, - это цикл по коллекции (я держу ссылку) и найти выбранную вкладку. Но вы, вероятно, правы, должен быть другой способ узнать текущий выбранный вид. Не могли бы вы также помочь мне с разделом/копией части вопроса? Тогда я мог бы отметить ваш ответ как принятый. – kajovajo

+0

См. Дополнение к моему ответу. –

+0

Только что обнаруженный элемент управления, который я использую (док-станция Telerik), не поддерживает SelectedItem (или что-то вроде ActiveDocument в AvalonDock). Он имеет объект '' SelectedContent' или RadPane SelectedPane' - я мог бы сделать SelectedPane общественного объекта { GET {...} набором { BaseViewModel переменных = (значения в UserControl) .DataContext в BaseViewModel; } } , но я не знаю, понимаете ли вы это. – kajovajo

Смежные вопросы