2015-09-17 10 views
2

Я реализую автозаполнение в ComboBox, как показано ниже. Автозаполнение работает отлично. Единственная проблема, с которой я столкнулся, я бы хотел, чтобы мои SelectedItems отображались как ItemNumber[space]ItemDescription. В настоящее время он отображает только ItemNumber, когда я выбираю его из автозаполнения. Можете ли вы, ребята, обновить существующий код ниже.WPF ComboBox SelectedItem из Autocomplete

enter image description here

class ItemDetails 
{ 
    string _itemNumber; 
    string _itemDescription; 

    public string ItemNumber 
    { 
     get { return _itemNumber; } 
     set { _itemNumber = value; } 
    } 
    public string ItemDescription 
    { 
     get { return _itemDescription; } 
     set { _itemDescription = value; } 
    } 

    public ItemDetails() { } 
    public ItemDetails(string itemNo, string description) 
    { 
     _itemNumber = itemNo; 
     _itemDescription = description; 
    } 
} 

Populate Материал

private void InitMaterial() 
    { 
     List<ItemDetails> items = new List<ItemDetails>(); 

     for (int i = 0; i <= 1000; i++) 
     { 
      items.Add(new ItemDetails(i.ToString(), "Item " + i.ToString())); 
     } 

     cbo1.ItemsSource = items; 
    } 

XAML

<ComboBox x:Name="cboItemNoLegacy" HorizontalContentAlignment="Stretch" 
     TextSearch.TextPath="MaterialNumberLegacy" 
     ItemsSource="{Binding}" 
     IsSynchronizedWithCurrentItem="True" 
     IsEditable="True" 
     SelectedItem="{Binding LegacyItemNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, Mode=TwoWay, Converter={StaticResource MaterialMasterConverter}}" 
     SelectionChanged="cboItemNoLegacy_SelectionChanged"> 
<ComboBox.ItemContainerStyle> 
    <Style> 
     <Setter Property="Control.Padding" Value="0"></Setter> 
     <Style.Triggers> 
      <Trigger Property="ComboBoxItem.IsSelected" Value="True"> 
       <Setter Property="ComboBoxItem.Background" Value="SkyBlue" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ComboBox.ItemContainerStyle> 
<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <Grid Margin="0"> 
      <Border Margin="5" BorderThickness="0" BorderBrush="SteelBlue" 
       CornerRadius="1"> 
       <Grid HorizontalAlignment="Left"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 

        <TextBlock x:Name="tbSiteCode" FontWeight="Normal" Text="{Binding Path=ItemNumber}" Margin="0,0,7,0"></TextBlock> 
        <TextBlock Grid.Column="1" x:Name="tbSiteDesc" FontWeight="Normal" Text="{Binding Path=ItemDescription}" Margin="0,0,7,0"></TextBlock> 
       </Grid> 
      </Border> 
     </Grid> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

+0

Итак, у вас есть список ItemDetails, привязанный каким-то образом ('ItemsSource =" {Binding} "') к ItemsSource для ComboBox, откуда берутся свойства MaterialNumberLegacy и MaterialDescription? Что именно означает автозаполнение в вашем случае? –

+0

@NovitchiS Я редактировал мой код выше и включает в себя, как я заполняю поле со списком. Я также обновил XAML, чтобы использовать правильные свойства, которые я использовал. Ну текст, который будет отображаться в combobox, будет отличаться в функциональности автозаполнения. Когда я удаляю параметры автозаполнения в своем поле со списком, когда я выбираю элемент в поле со списком, он отображает ItemNumber и ItemDescription. Но, если в моем поле со списком есть настройки автозаполнения, в поле со списком будет отображаться только ItemNumber. Вы можете проверить приведенное выше изображение, которое я приложил для справки. – klaydze

ответ

3

Когда вы устанавливаете свойство IsEditable=True в ComboBox, выбранный элемент в области выбора не будет отображаться в DataTemplate используемого элемента. В этом случае у вас будет элемент управления TextBox. Этот элемент управления TextBox может отображать только строку.

Так что вам нужно предоставить свойство для этого TextBox с нужной форматированной строкой, которую вы хотите отобразить в области выбора. У вас есть свойство TextSearch.TextPath, чтобы указать, какое свойство в объекте Item следует рассматривать как значение для функции TextBox и TextSearch.

Добавьте свойство к вам ItemDetails класс с агрегированным значением строки:

public string AggregatedDescription 
{ 
    get { return String.Format("{0} {1}", ItemNumber, ItemDescription);} 
} 

Установите это свойство к элементу ComboBox TextSearch.TextPath="AggregatedDescription"

Другое решение (я предпочитаю этот) будет просто переопределить ItemDetails .ToString() метод, чтобы получить желаемое отформатированный значение:

public override string ToString() 
{ 
    return String.Format("{0} {1}", ItemNumber, ItemDescription); 
} 

в этом случае, вы не должны спе Указать имущество TextSearch.TextPath. Когда он не установлен, значение .ToString() текущего выбранного элемента будет использоваться как строка для функции TextSearch.

+0

Ницца! Оба подошли к работам отлично! Большое спасибо! – klaydze

Смежные вопросы