2013-11-29 2 views
0

Я хочу выделить (сделать жирным шрифтом и изменить его цвет) все элементы, текст которых начинается с текста текстового поля combobox.выделите элемент combobox, если текст начинается с текста текстового поля combobox

Я постарался ответить на вышеуказанный вопрос Google, но мне не повезло, чтобы получить похожие результаты, которые позволили бы решить мою проблему.

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

Update:

Вот код, который я попробовал:

<ComboBox x:Name="cbUnder" ItemsSource="{Binding GroupsAndCorrespondingEffects}" 
      IsEditable="True" SelectedItem="{Binding SelectedGroup, Mode=TwoWay}" 
      TextSearch.TextPath="GroupName" Grid.Column="1" Grid.ColumnSpan="4" Grid.Row="3"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <VirtualizingStackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding GroupName}" Width="250"> 
          <TextBlock.Style> 
           <Style TargetType="TextBlock"> 
            <Style.Triggers> 
             <Trigger Property="Text" Value="ComboBox_PART_Editable"> 
              <Setter Property="Foreground" Value="Red"></Setter> 
             </Trigger> 
            </Style.Triggers> 
           </Style> 
          </TextBlock.Style> 
         </TextBlock> 
         <TextBlock Text="{Binding CorrespondingEffect}" /> 
        </VirtualizingStackPanel> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 

Но я не знаю, что я должен заменить ComboBox_PART_Editable, и я не хочу, чтобы весь текст, я просто хочу использование Text.StartsWith

ответ

2

Я предполагаю, что предметы в вашем ComboBox просто равны string значениям. Вам придется изменить это и создать класс для отображения каждого элемента. Причиной этого является то, что вам понадобится свойство bool 'flag', которое вы можете привязать к DataTrigger, который будет выделять ваши записи в соответствии с вашими требованиями. Таким образом, вы можете сделать это:

public class CustomComboBoxItem : INotifyPropertyChanged 
{ 
    public string Value { get; set; } // Implement INotifyPropertyChanged correctly... 
    public bool IsHighlighted { get; set; } // ... here, unlike this example 
} 

Тогда вы должны были бы свойство коллекции в вашем коде позади или вид модели:

public ObservableCollection<CustomComboBoxItem> Items { get; set; } 

Опять же, вы должны реализовать интерфейс INotifyPropertyChanged правильно здесь. Тогда вы могли бы привязать его к ComboBox.ItemsSource собственности, как это:

<ComboBox ItemsSource="{Binding Items}" ... /> 

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

<DataTemplate DataType="{x:Type YourXmlNamespacePrefix:CustomComboBoxItem}"> 
    <TextBlock Text="{Binding Value}"> 
     <TextBlock.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsHighlighted}" Value="True"> 
         <Setter Property="Background" Value="LightGreen" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</DataTemplate> 

Последняя часть головоломки, чтобы установить IsHighlighted свойства в соответствии с вашими требованиями. Для этого нам нужно связать с свойством ComboBox.Text, чтобы мы знали, что это значение в коде. Для этого добавьте еще одно свойство рядом со свойством коллекции и обновлять IsHighlighted свойства элемента внутри всякий раз, когда она меняется:

public ObservableCollection<CustomComboBoxItem> Items { get; set; } 
public string InputValue 
{ 
    get { return inputValue; } 
    set 
    { 
     inputValue = value; 
     NotifyPropertyChanged("Items"); 
     for (int i = 0; i < Items.Count; i++) 
     { 
      Items[i].IsHighlighted = Items[i].StartsWith(inputValue); 
     } 
    } 
} 

... 

<ComboBox ItemsSource="{Binding Items}" Text="{Binding InputValue}" ... /> 

Ну что был немного более тщательно, чем я намеревался, но там вы идете. Дайте мне знать, как вы поживаете.

+0

Элементы в моей combobox - это не простые значения строк. Я имею в виду, что они представляют собой строки, но это поле со списком двух столбцов. См. Мой обновленный вопрос. – Khushi

+0

Тогда у вас уже есть версия класса 'CustomComboBoxItem' (явно называемая чем-то еще). Просто добавьте новые свойства в этот класс и действуйте точно так же. – Sheridan

+0

Я попытался реализовать ваш код. Я использую 'GroupsAndCorrespondingEffects' вместо' Items'. 'GroupsAndCorrespondingEffects' -' List '. Теперь, когда я пытаюсь написать следующую строку: 'Items [i] .IsHighlighted = Items [i] .StartsWith (inputValue);' Я получаю красную squigly строку под 'IsHighlighted' и' StartsWith'.Когда я навис над одним из них, он говорит мне: «GroupAndCorrespondingEffect» не содержит определения для «IsHighlighted», и не может быть найден метод расширения для «IsHighlighted», принимающий первый аргумент типа «GroupAndCorrespondingEffect». ' – Khushi

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