Шаблон по умолчанию для выпадающего списка: Как IsEditable переключает текстовое поле и Contentpresenter

#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>
  

вы можете настроить его под свои нужды