@ette

C# WPF MVVM как получить ссылку на объект, выполнивший команду по привязке?

Изучаю WPF, недавно познакомился с шаблоном MVVM и при изучении возник вопрос.
Допустим, в разметке имеется контрол, есть кнопка с байндингом команды. Есть некая задача, которую нужно решить - переключение между вкладками TabControl по нажатии на кнопку, изменение других контролов, находящихся внутри TabItem.
Например, есть разметка:
<Window...>
<DockPanel>
<TabControl x:Name="tabControl" ItemsSource="{Binding Tabs}"/>
</DockPanel>
</Window>


App.xaml:
<!--Для каждого экземпляра класса SuperTabOne:SuperTab -->
  <DataTemplate DataType="{x:Type local:SuperTabOne}">
                <StackPanel>
                    <Button Content="Перейти на вторую вкладку" Command="{Binding SelectTab}"></Button>
                </StackPanel> 
        </DataTemplate>


MainWindowViewModel:
//коллекция классов, представляющих вкладки для TabControl аля SuperTabOne, SuperTabTwo, SuperTabEnd и др.
public ObservableCollection<SuperTab> Tabs
        {
            get { return _tabs ?? (_tabs = new ObservableCollection<SuperTab>()); }
        }
        private ObservableCollection<SuperTab> _tabs;

       RelayCommand _selectTabCommand;
        public ICommand SelectTab
        {
            get
            {
               if (_selectTabCommand == null)
                 _selectTabCommand = new RelayCommand(ExecuteSelectTabCommand, CanExecuteSelectTabCommand);
               return _selectTabCommand;
            }
        }


        public void ExecuteSelectTabCommand(object parameter)
        {
          //выбрать следующую вкладку
        }

        public bool CanExecuteSelectTabCommand(object parameter)
        {
           //логика...
            return true;
        }


Как в методе выполнения команды (ExecuteCommand) обратится к контролу, чтобы произвести над ним какие-либо действия? Или, к примеру, как обратиться к элементу, вызвавшему событие (выполнившему команду по привязке) и нужно ли это делать? Пока для меня это неочевидно(

Сейчас разные вкладки TabItem я создаю выполнением некой команды AddTab, хотелось бы реализовать и другие действия при выполнении соответствующей команды (в ExecuteCommand):

1. Переход от одной вкладки к другой. Хотелось бы понять, как узнать, какая вкладка выбрана и как выбрать другую.

2. Изменение других контролов, не принадлежащих TabControl. Если точнее, при выборе вкладки должны, например, появляться TextBox'ы на правой панели или, например, кнопки в нижней панели - статусбаре. При переходе от вкладки к вкладке будут меняться и TextBox'ы - для каждой вкладки - свои.

3. Закрытие вкладки. В общем-то, есть соображения как это делается, но хотелось бы получить рекомендации и по данному пункту .

Как это реализуется в MVVM? Пожалуйста распишите ЛОГИКУ решения данных задач в рамках MVVM WPF. Если можно, приведите какой-нибудь код в качестве примера, поделитесь ссылкой на проект с наглядным решением подобных задач, если таковые вам известны. Заранее благодарю.
  • Вопрос задан
  • 1105 просмотров
Решения вопроса 1
@tex0
Как в методе выполнения команды (ExecuteCommand) обратится к контролу, чтобы произвести над ним какие-либо действия?

2. Изменение других контролов, не принадлежащих TabControl.

Все взаимодействия через модель приложения.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы