Controlling the TabControl active tab with a ComboBox
What i am really trying to achieve is to full control the active TabItem by using the combobox as the navigation control.
Here is what ive got so far:
Still the only thing that actual works is the list that shows up when i press the togglebutton of the combobox. Even selecting a tabitem name through the list does not do anything, it does not even update the selected value textbox of the combobox.
Edit: Ok the answer of Steve Robbins worked fine for the «controling» issue.
What about the fact that selecting an item in the combobox drop down list does not update the value of the combobox? (the comboboxes textbox is still blank!!)
![]()
4 Answers 4
If you’re trying to control the TabControl from the Combo then it looks a bit backwards to me.. if you change the SelectedIndex on the tab control to bind it to the combo it should work:
I started looking at this because of some problems I’m having with the combobox. Unfortunately, I haven’t solved my problem but I can provide some additional insight and a workaround to this problem. First off, lets start with my changes to the original xaml.
Notice that instead of creating a binding from the tab control to the ComboBox and vice versa we can create a TwoWay binding (the default in this case) between the SelectedIndex of the tab and combo controls. Next, let’s add some content to the TabItems. At this point, similar to Steve’s suggestion, we’ve fixed the «controling» problem. That is, changing the selected TabItem changes the selected ComboBox item (you’ll have to trust me on this one or keep reading!) and changing the ComboBox changes the selected TabItem. Great!
The above xaml also changes DiplayMemberPath property to «Name». I think you will find that this eliminates hughdbrown’s «weird result». Recall that the Header property (an object) is wrapped by a ContentPresenter. I believe that if no template is supplied the default behavior is to display the Header object as a string in a TextBlock. Thus, the «weird result» correctly reports that the TextBlock control does not contain a Header property.
Now let’s make some changes to the previous ComboBox xaml.
This actually produces an interesting result and makes use of the content we added to each TabItem. When this code runs, you’ll notice that the ComboBox now displays the selected TabItem’s content. Furthermore, the list now displays «System.Windows.Controls.TabItem. » for each TabItem. We can change the TextBlock binding to
First, let’s create a ValueConverter to convert the TabControl’s Items collection to something we can use. Here’s the code.
The converter simply creates a new collection from the TabControl’s Items collection that contains the string-ized Header object from each TabItem. This works fine for simple Header objects but obviously has limitations. Now let’s consider how we use this in the xaml.
Remember that a ValueConverter used in an ItemsSource binding returns a new collection. In this case we are converting the TabControl’s Items collection to a string collection. Don’t forget to create the converter StaticResource! It looks something like this.
Now, using the converter, the whole ball of wax works as expected.
What still puzzles me is why the ComboBox displays the TabItem Headers in the list and the TabItem content as the selection. No doubt there is some obvious explanation but as I said, it’s Friday.
Wpf tabitem как переключать с помощью combobox
What i am really trying to achieve is to full control the active TabItem by using the combobox as the navigation control.
Here is what ive got so far:
Still the only thing that actual works is the list that shows up when i press the togglebutton of the combobox. Even selecting a tabitem name through the list does not do anything, it does not even update the selected value textbox of the combobox.
Edit: Ok the answer of Steve Robbins worked fine for the «controling» issue.
What about the fact that selecting an item in the combobox drop down list does not update the value of the combobox? (the comboboxes textbox is still blank!!)
![]()
4 Answers 4
If you’re trying to control the TabControl from the Combo then it looks a bit backwards to me.. if you change the SelectedIndex on the tab control to bind it to the combo it should work:
I started looking at this because of some problems I’m having with the combobox. Unfortunately, I haven’t solved my problem but I can provide some additional insight and a workaround to this problem. First off, lets start with my changes to the original xaml.
Notice that instead of creating a binding from the tab control to the ComboBox and vice versa we can create a TwoWay binding (the default in this case) between the SelectedIndex of the tab and combo controls. Next, let’s add some content to the TabItems. At this point, similar to Steve’s suggestion, we’ve fixed the «controling» problem. That is, changing the selected TabItem changes the selected ComboBox item (you’ll have to trust me on this one or keep reading!) and changing the ComboBox changes the selected TabItem. Great!
The above xaml also changes DiplayMemberPath property to «Name». I think you will find that this eliminates hughdbrown’s «weird result». Recall that the Header property (an object) is wrapped by a ContentPresenter. I believe that if no template is supplied the default behavior is to display the Header object as a string in a TextBlock. Thus, the «weird result» correctly reports that the TextBlock control does not contain a Header property.
Now let’s make some changes to the previous ComboBox xaml.
This actually produces an interesting result and makes use of the content we added to each TabItem. When this code runs, you’ll notice that the ComboBox now displays the selected TabItem’s content. Furthermore, the list now displays «System.Windows.Controls.TabItem. » for each TabItem. We can change the TextBlock binding to and display the Header object but the ComboBox still displays the selected TabItem’s content. As it is late on a Friday evening and there just is not enough beer in the world, I didn’t look into possible reasons for this. However, I do have a workaround!
First, let’s create a ValueConverter to convert the TabControl’s Items collection to something we can use. Here’s the code.
The converter simply creates a new collection from the TabControl’s Items collection that contains the string-ized Header object from each TabItem. This works fine for simple Header objects but obviously has limitations. Now let’s consider how we use this in the xaml.
Remember that a ValueConverter used in an ItemsSource binding returns a new collection. In this case we are converting the TabControl’s Items collection to a string collection. Don’t forget to create the converter StaticResource! It looks something like this.
Now, using the converter, the whole ball of wax works as expected.
What still puzzles me is why the ComboBox displays the TabItem Headers in the list and the TabItem content as the selection. No doubt there is some obvious explanation but as I said, it’s Friday.
Wpf tabitem как переключать с помощью combobox
Хочу что бы текущие табы одноименного контрола были видны в комбобокс. Дабы не заморачиваться связал их через "елементНам биндинг."
Получил недорезультат, т.к. в комбобоксе табы появились и через него можно менять текущий там в табКонтроле, НО в самом комбобоксе НЕ отображается имя выбранного элемента. То есть, комбобокс разворачиваю, выбираю итем — таб сменился. В КОМБОБОКСЕ ЛЕЙБА ТЕКУЩЕГО НЕ ОТОБРАЗИЛАСЬ, разворачиваю снова комбобокс, а во всём списке объектов выбранный на текущий момент подсвечен синим.
То есть, вопрос в том почему же не отображается лейба текущего выбранного элемента в шапке комбобокса??
на итемСоурс чего то биндится не захотел
Ну и конечно же, скриншотик
TabControl в WPF
Здравствуйте. Нужен совет или ссылку (чтобы не изобретать велосипед "Желательно free"). Как в.
TabControl.Selecting в WPF
Есть две вкладки: на одной теория по английскому, на другой тест, нужно чтобы в процессе.
WPF TabControl через XAML
Доброго всем времени суток. Люди, подскажите, желательно, как через XAML в WPF сделать вкладки у.
Wpf скрыть TabItem у TabControl
хочу скрыть один таб итем. указываю <TabControl Grid.Row="0"> <TabItem.
Пиопле. вер аре ю?? ;( гуру WPF-а вы где?
Добавлено через 23 часа 22 минуты
кОмрадс-Ы, ну где вы? кто нить выручить то может? ;(
Сообщение от DarkOrk
Я бы уже давно бы нашел решение в инете.
Вы ноете а мы, продолжаем бесполезно тратить время, на то, что в целом проблемой не считается:
WpfApplication3.zip
Проект с другого топика по этому за корявость уж "пРоСтиТе" .
Проигнорировав вашу наглость, чутку поменяю просьбу.
Кто-то может внести изменения в прилагаемый проект что бы он работал корректно (проблема там та же что и описана в шапке).
Не нужно писать 3 десятков классов да бы показать на сколько вы хорошо знаете MVVM. Там где то косяк в бинденге. Может кто-то с высоты своего полёта окинув взглядом сможет показать какую строку я не дописал или опечатку в какой сделал?!
| WpfApplication10.rar (8.2 Кб, 12 просмотров) |
Сообщение от DarkOrk
Это по моему вы нагло ВыпенДрИваетесь не зная сути вопроса выкаблучиваетесь и унижаете труд других людей.
Для особо одаренных не умеЮЩиХ читать тех. часть поясняю:
Вы пытаетесь одну и тужу часть визуального дерева запихнуть в 2 разных места: TabControl визуализирует TabItem (содержит его в своей части дереве) и ComboBox через Bindind пытается заполучает объект и соответственно его визуализировать — так нельзя ибо это ограничение xaml (наверно, все же, wpf платформы). Для каждого объекта (не важно, что за объект) в xaml дереве должна генерироваться своя уникальная часть разметки — или простым языком: его визуальная часть.
По большей части во всем виноват ContentPresenter который использует свойство зависимости SelectionBoxItem, и проблема решается переопределением стиля/шаблона.
П.С. Да вы и сами могли поэкспериментировать например убрав DisplayMemberPath="Header" вы сразу получите ошибку объясняющую всю суть проблемы:
"Необходимо отсоединить указанный дочерний элемент от родительского элемента Visual, прежде чем подсоединять его к новому элементу Visual." По этому в Wpf принято использовать подход MVVM — потому, что он исключает такого рода проблемы, а не типо
Wpf tabitem как переключать с помощью combobox
What i am really trying to achieve is to full control the active TabItem by using the combobox as the navigation control.
Here is what ive got so far:
Still the only thing that actual works is the list that shows up when i press the togglebutton of the combobox. Even selecting a tabitem name through the list does not do anything, it does not even update the selected value textbox of the combobox.
Edit: Ok the answer of Steve Robbins worked fine for the «controling» issue.
What about the fact that selecting an item in the combobox drop down list does not update the value of the combobox? (the comboboxes textbox is still blank!!)
![]()
4 Answers 4
If you’re trying to control the TabControl from the Combo then it looks a bit backwards to me.. if you change the SelectedIndex on the tab control to bind it to the combo it should work:
I started looking at this because of some problems I’m having with the combobox. Unfortunately, I haven’t solved my problem but I can provide some additional insight and a workaround to this problem. First off, lets start with my changes to the original xaml.
Notice that instead of creating a binding from the tab control to the ComboBox and vice versa we can create a TwoWay binding (the default in this case) between the SelectedIndex of the tab and combo controls. Next, let’s add some content to the TabItems. At this point, similar to Steve’s suggestion, we’ve fixed the «controling» problem. That is, changing the selected TabItem changes the selected ComboBox item (you’ll have to trust me on this one or keep reading!) and changing the ComboBox changes the selected TabItem. Great!
The above xaml also changes DiplayMemberPath property to «Name». I think you will find that this eliminates hughdbrown’s «weird result». Recall that the Header property (an object) is wrapped by a ContentPresenter. I believe that if no template is supplied the default behavior is to display the Header object as a string in a TextBlock. Thus, the «weird result» correctly reports that the TextBlock control does not contain a Header property.
Now let’s make some changes to the previous ComboBox xaml.
This actually produces an interesting result and makes use of the content we added to each TabItem. When this code runs, you’ll notice that the ComboBox now displays the selected TabItem’s content. Furthermore, the list now displays «System.Windows.Controls.TabItem. » for each TabItem. We can change the TextBlock binding to and display the Header object but the ComboBox still displays the selected TabItem’s content. As it is late on a Friday evening and there just is not enough beer in the world, I didn’t look into possible reasons for this. However, I do have a workaround!
First, let’s create a ValueConverter to convert the TabControl’s Items collection to something we can use. Here’s the code.
The converter simply creates a new collection from the TabControl’s Items collection that contains the string-ized Header object from each TabItem. This works fine for simple Header objects but obviously has limitations. Now let’s consider how we use this in the xaml.
Remember that a ValueConverter used in an ItemsSource binding returns a new collection. In this case we are converting the TabControl’s Items collection to a string collection. Don’t forget to create the converter StaticResource! It looks something like this.
Now, using the converter, the whole ball of wax works as expected.
What still puzzles me is why the ComboBox displays the TabItem Headers in the list and the TabItem content as the selection. No doubt there is some obvious explanation but as I said, it’s Friday.
Изменение выбора WPF ComboBox при изменении выбора TabItem
У меня есть выпадающая скобка в элементе табуляции в MVVM. Эта вкладка может быть создана несколько раз в моем приложении (тот же вид, одна и та же модель представления, но другой экземпляр), поэтому я могу переключаться с одной вкладки на другую (но они являются вкладками одного типа).Изменение выбора WPF ComboBox при изменении выбора TabItem
Он отлично работает с каждым элементом управления WPF, но с combobox у меня странное поведение: вкладка фокуса, когда она теряет фокус, получает выбранный элемент поля combox вкладки, на которую фокусируется приложение.
Если я переключаюсь с 2 вкладок, которые не одного типа, все работает правильно, любое представление об этом? Благодарю.
мои закладки обрабатываются таким образом:
и рабочие пространства (мой список ViewModels) (T класс, который наследует от viewModelBase)
Элемент управления ComboBox
Элемент управления ComboBox во многом похож на элемент управления ListBox, но занимает значительно меньше места, потому что список элементов скрыт, когда он не нужен. Элемент управления ComboBox повсеместно используется в Windows, но чтобы убедиться, что все знают, как он выглядит и работает, мы начнем с простого примера:

На скриншоте я активировал элемент управления, щелкнув по нему, в результате чего отобразился весь список элементов. Как видно из кода, обычный ComboBox очень прост в использовании. Все, что я сделал здесь, это вручную добавил несколько элементов, указав один из них выбранным по умолчанию, задав его свойство IsSelected равным True.
Форматирование элементов
В первом примере мы показали список состоящий из текстовых элементов. Это довольно распространенный способ использования элемента управления ComboBox, но поскольку ComboBoxItem является ContentControl, мы можем использовать практически что угодно в качестве элементов списка. Давайте попробуем сделать несколько более сложный список:

Для каждого из ComboBoxItem мы теперь добавляем StackPanel, содержащий Image и TextBlock. Это дает нам полный контроль над содержимым, а также управление отрисовкой текста, что заметно на скриншоте, где и цвет текста, и изображение указывают значение цвета.
Связывание данных (Data binding) в ComboBox
Как видно из первых примеров, задавать элементы списка ComboBox из XAML очень просто, но у вас, скорее всего, скоро возникнет ситуация когда понадобятся элементы поступающие из какого-то источника, например, базы данных или списка в памяти. Используя привязку данных (data binding) мы можем легко отобразить список цветов, с предварительным просмотром цвета:

Все довольно просто: В C# я получаю список всех цветов из класса Colors через рефлексию и назначаю его свойству ItemsSource ComboBox, которое затем отображает каждый цвет, используя шаблон из XAML.
Каждый элемент, определенный в ItemTemplate, состоит из StackPanel содержащей Rectangle и TextBlock, каждый из которых привязан к значению цвета. Это дает нам полный список цветов, с минимальными усилиями — выглядит неплохо, не правда ли?
Свойство IsEditable
В первых примерах пользователь мог выбирать только из нашего списка элементов, но одна из интересных особенностей ComboBox заключается в предоставлении возможности пользователю ввести свое значение не ограничиваясь предоставленным списком. Это чрезвычайно полезно когда вы хотите предоставить заранее сформированный список и одновременно оставляете возможность пользователю указать свое значение. Все это контролируется свойством IsEditable которое немного изменяет поведение и внешний вид ComboBox.

Как вы видите я могу, как ввести совершенно другое значение, так и выбрать одно из списка. Если выбран элемент списка, то он просто перезапишет текст в ComboBox.
В качестве небольшого бонуса ComboBox будет автоматически пытаться помочь пользователю, начавшему набирать текст, выбрать существующее значение. Что можно увидеть на следующем скриншоте, где я только начал набирать «Co»:

По умолчанию, совпадения не чуствительны к регистру, но это можно исправить установив свойство IsTextSearchCaseSensitive равным True. Если же вы хотите совсем отключить автоматические подсказки — это можно сделать установив свойство IsTextSearchEnabled в значение False.
Управление выбором в ComboBox
Ключевой частью использования элемента управления ComboBox является возможность обработки выбора пользователя и даже возможность управления им с помощью кода. В следующем примере я повторно использовал код из части использующей привязку данных ComboBox, только добавил несколько кнопок управления выбором. Также я использовал событие SelectionChanged для обработки любого изменения ComboBox, вызванного пользователем или кодом.

Интересной частью этого примера являются обработчики событий для трех кнопок, а также обработчик события SelectionChanged. В первых двух событиях мы выбираем предыдущий или следующий элемент, читая свойство SelectedIndex, а затем убавляем или увеличиваем его значение. Все довольно просто.
В обработчике третьего события мы используем SelectedItem для выбора определенного элемента на основе его значения. Здесь я использую рефлексию потому что ComboBox привязан к списку цветов из класса Color, и нам требуется свойству SelectedItem присвоить именно значение определенного цвета (Blue) из класса Color.
В четвертом и последнем обработчике я работаю с событием SelectionChanged которое срабатывает при изменении значения ComboBox. Когда это происходит, я через рефлексию получаю значение выбранного цвета и использую его для создания кисти которая задает фон окна. Результат можно увидеть на скриншоте.
Если вы работает с редактируемым ComboBox (свойство IsEditable установленно в True), вы можете прочитать свойство Text чтобы узнать какое значение ввел или выбрал пользователь.
Управление активной вкладкой TabControl с помощью ComboBox
Я действительно пытаюсь достичь полного контроля над активным элементом TabItem, используя поле со списком в качестве элемента управления навигацией.
Вот что я получил на данный момент:
Тем не менее, единственное, что действительно работает, — это список, который появляется, когда я нажимаю кнопку-переключатель в поле со списком. Даже выбор имени элемента табуляции в списке ничего не делает, он даже не обновляет текстовое поле выбранного значения поля со списком.
Изменить: Хорошо, ответ Стива Роббинса отлично справился с проблемой «контроля».
Как насчет того факта, что выбор элемента в раскрывающемся списке поля со списком не обновляет значение поля со списком? (текстовое поле со списком все еще пусто !!)
задан 13 фев ’09, 12:02
Вы узнали, почему DisplayMemberPath = «Header» не работает? — Coder14
4 ответы
Если вы пытаетесь управлять TabControl из Combo, то для меня это выглядит немного наоборот . если вы измените SelectedIndex в элементе управления вкладкой, чтобы привязать его к комбо, он должен работать:
Я начал смотреть на это из-за некоторых проблем, которые у меня возникли с полем со списком. К сожалению, я не решил свою проблему, но могу предоставить дополнительную информацию и способ решения этой проблемы. Во-первых, давайте начнем с моих изменений в исходном xaml.
Обратите внимание, что вместо создания привязки от элемента управления вкладкой к ComboBox и наоборот, мы можем создать привязку TwoWay (в данном случае по умолчанию) между SelectedIndex вкладки и комбинированными элементами управления. Затем давайте добавим контент в TabItems. На этом этапе, как и в случае с предложением Стива, мы устранили проблему «контроля». То есть, изменение выбранного элемента TabItem изменяет выбранный элемент ComboBox (вы должны мне доверять или продолжайте читать!), А изменение ComboBox изменяет выбранный элемент TabItem. Большой!
Приведенный выше xaml также изменяет свойство DiplayMemberPath на «Name». Я думаю, вы обнаружите, что это устраняет «странный результат» hughdbrown. Напомним, что свойство Header (объект) обернуто ContentPresenter. Я считаю, что если шаблон не предоставлен, по умолчанию объект Header отображается в виде строки в TextBlock. Таким образом, «странный результат» правильно сообщает, что элемент управления TextBlock не содержит свойства Header.
Теперь внесем некоторые изменения в предыдущий файл ComboBox xaml.
На самом деле это дает интересный результат и использует контент, который мы добавили в каждый элемент TabItem. При запуске этого кода вы заметите, что ComboBox теперь отображает содержимое выбранного элемента TabItem. Кроме того, в списке теперь отображается «System.Windows.Controls.TabItem . » для каждого элемента TabItem. Мы можем изменить привязку TextBlock на
Во-первых, давайте создадим ValueConverter для преобразования коллекции Items TabControl во что-то, что мы можем использовать. Вот код.
Конвертер просто создает новую коллекцию из коллекции Items элемента управления TabControl, которая содержит строковый объект Header из каждого элемента TabItem. Это отлично работает для простых объектов заголовка, но, очевидно, имеет ограничения. Теперь давайте рассмотрим, как мы используем это в файле xaml.
Помните, что ValueConverter, используемый в привязке ItemsSource, возвращает новую коллекцию. В этом случае мы конвертируем коллекцию Items элемента управления TabControl в коллекцию строк. Не забудьте создать конвертер StaticResource! Выглядит это примерно так.
Теперь, используя конвертер, весь восковой шарик работает должным образом.
Меня все еще озадачивает, почему ComboBox отображает заголовки TabItem в списке и содержимое TabItem в качестве выбора. Без сомнения, есть какое-то очевидное объяснение, но, как я уже сказал, сегодня пятница .