WPF TabControl - невозможно программно выбрать вкладки - PullRequest
12 голосов
/ 25 мая 2011

У меня есть пользовательский интерфейс с TabControl, который первоначально отображает стартовую страницу.Другие элементы можно добавить к нему, дважды щелкнув по содержимому, например, в DataGrid.Новые вкладки должны быть выбраны при их создании.Если документ, соответствующий элементу в сетке, уже открыт, то вместо создания новой вкладки следует открыть существующую вкладку для этого документа.

Я знаю, что должен иметь возможность программно выбирать вкладку с помощьюустановка свойств SelectedItem или SelectedIndex для TabControl.Однако нужная вкладка фактически никогда не активируется.Если я установлю один и затем проверю состояние TabControl в отладчике, то оба поля, кажется, обновляются правильно.Однако после продолжения выполнения я вижу, что выбранная вкладка остается неизменной в пользовательском интерфейсе, и если я снова приостанавливаю и проверяю состояние TabControl, я вижу, что SelectedItem и SelectedIndex вернулись к своим предыдущим значениям.С другой стороны, выбор вкладки путем нажатия на нее в пользовательском интерфейсе работает просто отлично.

Вот объявление для TabControl:

<TabControl x:Name="Tabs" >
    <TabItem x:Name="StartPageTab" Header="Start Page" DataContext="{Binding Path=StartPageViewModel}">
        ...
    </TabItem>
</TabControl>

И код для добавления и выбора вкладок:

private void _SelectTab(MyViewModel model)
{
    TabItem tab;
    if (_TryFindTab(model, out tab)) Tabs.SelectedItem = tab;
}

private bool _TryFindTab(MyViewModel target, out TabItem tab)
{
    foreach (TabItem item in Tabs.Items)
    {
        MyViewModel model = item.DataContext as MyViewModel;
        if (model != null && model.Equals(target))
        {
            tab = item;
            return true;
        }
    }
    tab = null;
    return false;
}

private void _AddTab(MyViewModel model)
{
    TabItem tab = new TabItem { DataContext = model, Content = new MyView() };
    Binding bind = new Binding { Source = model, Path = new PropertyPath("Name") };
    tab.SetBinding(TabItem.HeaderProperty, bind);

    Tabs.Items.Add(tab);
    Tabs.SelectedItem = tab;
}

Ответы [ 4 ]

19 голосов
/ 26 мая 2011

Оказалось, что это связано с чем-то, что я удобно исключил из исходного описания проблемы:

Рассматриваемая DataGrid содержалась в StartPageTab.Я обрабатывал двойной щелчок по этой DataGrid, захватывая его событие MouseDoubleClick, просматривая визуальное дерево, чтобы найти двойной щелчок по DataGridRow (если есть), и затем вызывая событие, которое в конечном итоге было захвачено главным окном, которое отвечало бывызывая _SelectTab или _AddTab, в зависимости от того, был ли данный документ уже открыт.

В этот момент стек вызовов развернется и вернется к этому обработчику событий MouseDoubleClick.В этом обработчике я забыл установить свойство Handled MouseButtonEventArgs в true.Таким образом, WPF продолжал искать кого-то еще, чтобы обработать это событие щелчка - и элемент, который он в конечном итоге нашел, отвечал, запрашивая фокус, что, в свою очередь, означало, что исходной вкладке нужно было вернуть фокус.

Добавление e.Handled = true; остановил весь этот беспорядок в своих треках, чтобы новая вкладка могла остаться выделенной.

4 голосов
/ 25 мая 2011

Вы можете попробовать использовать tab.focus ()

В моем приложении есть вкладки, и это быстрый способ сделать выбранную вкладку видимой.

0 голосов
/ 25 мая 2011

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

MyTabControlWithMultiplePages.SelectTab(PageIWantShown);
0 голосов
/ 25 мая 2011

Вы пробовали связываться с TabItem.IsSelected и обновлять его в представлении модели?

...