#c# #.net #wpf #combobox
#c# #.net #wpf #выпадающий список
Вопрос:
Я использую ComboBox
в WPF, но есть одно поведение, которое я не понимаю: вот ссылка на стиль / шаблон по умолчанию ComboBox
. Когда IsEditable
значение True, TextBox
отображается, и пользователь может вводить текст для поиска. Я не совсем понял это, поэтому я проверял код:
<ContentPresenter x:Name="ContentSite"
IsHitTestVisible="False"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
Margin="3,3,23,3"
VerticalAlignment="Stretch"
HorizontalAlignment="Left">
</ContentPresenter>
<TextBox x:Name="PART_EditableTextBox"
Style="{x:Null}"
Template="{StaticResource ComboBoxTextBox}"
HorizontalAlignment="Left"
VerticalAlignment="Bottom"
Margin="3,3,23,3"
Focusable="True"
Background="Transparent"
Visibility="Hidden"
IsReadOnly="{TemplateBinding IsReadOnly}" />
Кажется, что два визуальных компонента перекрываются и IsEditable
переключаются между ними, устанавливая Visibility
. Эта ссылка подтверждает, что: «Когда IsEditable равно false , ComboBox использует ContentPresenter для отображения текущего выбранного элемента; когда IsEditable равно true, для этой цели вместо этого используется текстовое поле. Обратите внимание, что текстовое поле отображает только обычный текст, и что элемент ComboBoxItem может включать в себя не обычный текстовый контент, такой как изображения. » Мой вопрос в том TextBox
, где он определяет текст? Template
(ComboBoxTextBox) не присваивает текст. Я спрашивал, потому что я пытаюсь заставить TextBox
отображать ту же информацию (если это когда-либо возможно), ContentPresenter
что и (т. Е., Когда IsEditable
значение равно False), шаблон которого, как я понимаю, привязан к Template
I assign.
Комментарии:
1. вы пытаетесь создать выпадающий список для поля со списком? или хотите переключаться между редактируемыми и доступными только для чтения с помощью шаблона?
2. @pushpraj Я пытаюсь разрешить
TextBox
(который виден только тогда, когдаIsEditable
имеет значение True, потому что в противномContentPreseter
случае виден, как предполагает моя вторая ссылка) иметь то жеItemTemplate
, что я установил. Потому что по умолчанию, еслиIsEditable
значение равно true,TextBox
то оно отображается, а значениеItemTemplate
не применяется к нему. Он используетToString
функцию выбранного элемента или отображает значение свойства элемента (ToString
), если я установилTextSearch.TextPath
наComboBox
. Ни один из них не является тем, что я хочу, потому что я хочу, чтобы редактируемыйTextBox
отображал больше информации, как я определил вItemTemplate
3. @pushpraj Итак, я пытаюсь понять, как работает шаблон по умолчанию, надеясь, что смогу изменить его, когда пойму. Но пока я не вижу никаких настроек для текста
TextBox
.4. @tete Во-первых, «текстовое поле отображается, и пользователь может вводить текст для поиска». неверно. Это только позволяет пользователю вводить текст. Вы можете добавить
Text="{TemplateBinding ComboBox.Text}"
в<TextBox x:Name="PART_EditableTextBox"/>
, у них тот же результат. Так что, я думаю, есть что-то по умолчанию. да, просто угадайте..
Ответ №1:
вот простой базовый шаблон для текстового поля для вас, содержащий только часть редактирования текста
таким образом, установка IsReadOnly=»True» сделает его похожим на ContentPresenter, в противном случае он доступен для редактирования как текстовое поле
<TextBox Text="edit me">
<TextBox.Template>
<ControlTemplate TargetType="TextBox">
<ScrollViewer x:Name="PART_ContentHost" />
</ControlTemplate>
</TextBox.Template>
</TextBox>
вы можете настроить его под свои нужды