Не удается отобразить DataTemplate для выбранного элемента в поле со списком?

Вопрос новичка. В следующем поле со списком раскрывающийся список правильно отображает название компании и номер телефона в соответствии с DataTemplate. Однако выбор элемента из раскрывающегося списка (мышью) приводит только к отображению имени объекта:

  Stargate_V.DataService.View_Small_Company

Выбранное название компании и номер телефона не отображаются. Что я делаю не так?

 <ComboBox 
  ItemsSource="{Binding PrimaryInsurance.Companies}"
  ItemTemplate="{StaticResource CompanyTemplate}"
  IsEditable="True"
  IsTextSearchEnabled="True"              
  Height="20" HorizontalAlignment="Left" Margin="375,235,0,0" VerticalAlignment="Top" Width="198"  />

CompanyTemplate:

<DataTemplate x:Key="CompanyTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Companyname}" Width="240"/>
                <TextBlock Text="|" Width="10"/>
                <TextBlock Text="{Binding Phone}" Width="80" />
            </StackPanel>
        </DataTemplate>

ТИА


person Alan Wayne    schedule 29.08.2015    source источник
comment
Если вы не хотите, чтобы текст редактировался, вы можете установить IsEditable в False, и это решит вашу проблему,   -  person Rohit Vats    schedule 30.08.2015
comment
@RohitVats В дальнейшем мне нужно будет принять пользовательский ввод, поскольку я направляюсь к выпадающему списку автофильтрации. Поэтому мне нужно, чтобы IsEditable был истинным. Спасибо.   -  person Alan Wayne    schedule 30.08.2015


Ответы (1)


Проблема, с которой вы столкнулись, заключается в сочетании отображения сложного типа (например, класса) с DataTemplate, а ваш ComboBox имеет IsEditable значение true. При установке IsEditable в значение true ComboBox не знает, какое свойство использовать для поиска, поэтому он просто вызывает ToString для объекта и отображает результаты. Чтобы решить эту проблему, вам нужно установить TextSearch.TextPath на имя свойства объекта, который вы хотите использовать для поиска. Как только вы это сделаете, это свойство отобразится в поле выбора вместо результата ToString. Ниже показано, как должен выглядеть ваш XAML, если вы хотите выполнить поиск по свойству Companyname вашего объекта.

<ComboBox 
  ItemsSource="{Binding PrimaryInsurance.Companies}"
  ItemTemplate="{StaticResource CompanyTemplate}"
  IsEditable="True"
  IsTextSearchEnabled="True"
  TextSearch.TextPath="Companyname"              
  Height="20" HorizontalAlignment="Left" Margin="375,235,0,0" VerticalAlignment="Top" Width="198"  />
person Eric Mattison    schedule 29.08.2015
comment
Я вижу начальную ссылку, но ссылка на полный пример кажется неработающей. Так что мне придется сделать новый контроль? - person Alan Wayne; 30.08.2015
comment
Нет, вы должны иметь возможность просто назначить свой CompanyTemplate этому свойству, как вы сделали для ItemTemplate, и все готово. - person Eric Mattison; 30.08.2015
comment
SelectionBoxItemTemplate доступен только для чтения. Свойство "ComboBox.SelectionBoxItemTemplate" не может быть установлено, так как у него нет доступного метода доступа set. :( - person Alan Wayne; 30.08.2015
comment
О боже, я искал это на своем телефоне. Итак, поскольку ваш ComboBox доступен для редактирования, и вы используете сложный объект для отображения, нет возможности искать этот сложный объект в ComboBox, поэтому вам нужно выбрать свойство, позволяющее выполнять поиск с использованием свойства TextSearch.TextPath в ComboBox. Эта ссылка объясняет это подробнее. - person Eric Mattison; 30.08.2015
comment
Это сработало. Спасибо. (Пожалуйста, отредактируйте свой ответ, чтобы я мог указать вам.) :) - person Alan Wayne; 30.08.2015