Изучаю 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. Если можно, приведите какой-нибудь код в качестве примера, поделитесь ссылкой на проект с наглядным решением подобных задач, если таковые вам известны. Заранее благодарю.