Wpf tabitem как переключать с помощью combobox
Перейти к содержимому

Wpf tabitem как переключать с помощью combobox

Управление активной вкладкой 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 на и отобразить объект Header, но ComboBox по-прежнему отображает содержимое выбранного элемента TabItem. Поскольку уже поздний вечер пятницы и пива в мире просто не хватает, я не стал разбираться в возможных причинах этого. Однако у меня есть обходной путь!

Во-первых, давайте создадим ValueConverter для преобразования коллекции Items TabControl во что-то, что мы можем использовать. Вот код.

Конвертер просто создает новую коллекцию из коллекции Items элемента управления TabControl, которая содержит строковый объект Header из каждого элемента TabItem. Это отлично работает для простых объектов заголовка, но, очевидно, имеет ограничения. Теперь давайте рассмотрим, как мы используем это в файле xaml.

Помните, что ValueConverter, используемый в привязке ItemsSource, возвращает новую коллекцию. В этом случае мы конвертируем коллекцию Items элемента управления TabControl в коллекцию строк. Не забудьте создать конвертер StaticResource! Выглядит это примерно так.

Теперь, используя конвертер, весь восковой шарик работает должным образом.

Меня все еще озадачивает, почему ComboBox отображает заголовки TabItem в списке и содержимое TabItem в качестве выбора. Без сомнения, есть какое-то очевидное объяснение, но, как я уже сказал, сегодня пятница .

В WPF, как мне привязать combobox к элементам TabControl?

У меня есть простое окно WPF со следующими элементами управления: ComboBox наверху и TabControl под ним.

Я заполняю tabcontrol двумя стандартными TabItems. Затем я добавляю к нему еще несколько вкладок – однако это мой собственный класс “MyTab”, который просто наследует TabItem. Я ничего не делаю и не делаю ничего экзотичного, я просто добавил несколько публичных свойств.

Я хочу использовать ComboBox в качестве инструмента навигации. Каждая вкладка имеет заголовок, и тот же заголовок должен стать элементом в ComboBox. Если выбран из ComboBox, он должен сделать соответствующую вкладку активной.

Вот моя настройка в ComboBox:

.. и далее далее в Xaml…

Поэтому я просто привязываюсь к коллекции элементов TabControl и выбираю Header как свойство SelectedItem для отображения.

Он работает, и когда я нажимаю ComboBox, заголовки действительно отображаются как отдельные текстовые элементы. Но когда я делаю фактический выбор, эта вкладка будет отображаться в области выделения этой группы со списком!

Как это исправить? Почему он использует свойство заголовка для списка, но когда я выбираю из списка, отображаемое значение становится фактическим объектом TabItem? Я чувствую, что мне не хватает чего-то очевидного

Кстати, я знаю, что я сказал, что хочу использовать это для управления навигацией, но я все это убрал, и я буду беспокоиться об этом после того, как выясню эту сумасшедшую вещь.

Showing proper items in combobox

Посмотрите внимательно – когда я выбираю tabItem1 из выпадающего списка, он фактически повторно отображает этот элемент табуляции внутри элемента управления. Вы можете увидеть ее верхнюю часть, окруженную стандартным синим фоном выбора, который используется в элементе списка. сводящий с ума.

tabItem painting in combobox

Что я здесь делаю неправильно? Спасибо за любую помощь

Это способ работы WPF. Если выбранный элемент можно отобразить без DataTemplates, то это будет сделано. Поскольку коллекция элементов представляет собой набор элементов VISUAL, то DataTemplate не используется для рендеринга “выбранного” элемента.

Примечание: Выбранный элемент использует ContentPresenter, а в раскрывающемся списке используется другая вещь, называемая ItemsPresenter, которую ALWAYS визуализирует с помощью DataTemplate, даже если базовый связанный объект может быть отображен без него.

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!!)

user avatar

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *