Как программно выбрать TabItem в WPF TabControl
Я хотел бы знать, как выбрать конкретный TabItem в WPF TabControl.
Я пробовал это, но ничего не работает!
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabControl.SelectedValue = MyTabItem
MyTabItem.IsSelected = True
Ответы
Ответ 1
Как говорит @Chris, любая из первых трех вещей должна работать, и, как говорит @Phyxx, это не всегда действительно работает. Проблема заключается в некоторой тонкости в отношении порядка изменений свойств. Чтобы обойти это, вы должны позволить WPF вызывать ваш код выбора вкладок в свое время:
Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));
Это делает то, что делает таймер Phyxx, но немного менее экстремальным образом.
Ответ 2
Все ваши примеры, кроме третьего, являются правильными и будут работать. Проблема должна быть в другом месте. Возможно, вы reset элемент после настройки или ваш код никогда не вызывается?
Действительный
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabItem.IsSelected = True
Неверный
MyTabControl.SelectedValue = MyTabItem
Ответ 3
Прокрутите вкладку TabItems и для выбранной вкладки установите
tabItem.IsSelected = true
Если в результате изменения привязки есть другое место, вы увидите проблему. В противном случае вышеуказанный код должен работать.
Ответ 4
Одна вещь, о которой не упоминалось выше:
Основная причина, по которой это не работает, не будет заключаться в том, что элементы табуляции не имеют установленного свойства "Имя". Каждый элемент табуляции элемента управления вкладки, для которого вы хотите перейти программно, должен иметь свойство имени, установленное для работы любого из вышеуказанных кодов.
<tabItem Name="tab1"></tabItem>
Ответ 5
Я применил небольшое решение для привязки MVVM для прагматичного выбора панелей вкладок.
-
определить свойство в вашей модели представления - выбранный тип int
-
привязать свойство в вашем представлении
<TabControl
x:Name="TabsCandidate"
VerticalAlignment="Stretch"
TabStripPlacement="Top"
SelectedIndex="{Binding Selected}"
-
private int _selected;
public int Selected
{
get { return _selected; }
set
{
_selected = value;
OnPropertyChanged("Selected");
}
}
-
Задайте значение Выбрать, просто привязка активирует панель вкладок.
если вы хотите перемещаться с панели вкладок внутри панелей вкладок родителей, это решение будет просто работать. Все, что вам нужно сделать, это получить доступ к контексту данных вашего элемента управления и установить его
// set the property value of the view model which points the index of the tab controller.
((CandidateViewModel)((System.Windows.FrameworkElement)candidateTab.Content).DataContext).Selected = CandidateLogTabIndex;
Ответ 6
Попробуйте установить MyTabControl.SelectedIndex = x
в обработчике событий DataContextChanged
или Loaded
вашего пользовательского интерфейса. Надеюсь, что это сработает.
Ответ 7
Я пробовал все методы, которые должны были работать, но, как и вы, ничто не изменило выбранную вкладку. В конце концов, я получил его для работы, поставив код выбора вкладок в тике DispatcherTimer
.
DispatcherTimer switchTabTimer = new DispatcherTimer();
switchTabTimer.Interval = new TimeSpan(0);
switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
{
myTabControl.SelectedIndex = 0;
switchTabTimer.Stop();
};
switchTabTimer.Start();
Ответ 8
если вы не знаете индекс вкладки (подсказка, это не TabIndex
) используйте:
private async Task ChangeTabTo(TabItem wantedTab) {
int index = 0;
for (var i = 0; i < TabControl.Items.Count; i++) {
var tab = TabControl.Items[i];
var t = tab as TabItem;
if (t == null) continue;
if (t == wantedTab) {
index = i;
break;
}
}
await Dispatcher.BeginInvoke((Action)(() => TabControl.SelectedIndex = index));
}
или измените его для поиска по имени, если вы не хотите сохранять ссылку на вкладку