2013-11-07 3 views
1

Я следующие свойства на моей combobox-WPF Combbox Wildcard подстрока Поиск

<ComboBox ItemsSource="{Binding AllLines, Mode=OneWay}" Grid.Column="1" SelectedItem="{Binding SelectedLine}" Margin="4" 
       Visibility="{Binding ShowLines, Converter={StaticResource BoolToVisible}}" AlternationCount="2" 
       IsTextSearchEnabled="True" IsEditable="True" TextSearch.TextPath="SearchText" IsTextSearchCaseSensitive="False" 
       ItemContainerStyle="{StaticResource alternatingWithTriggers}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Margin="2,0,2,0" FontWeight="Bold" Text="{Binding Description}" 
           Visibility="{Binding Description, Converter={StaticResource NullVisibilityConverter}}"></TextBlock> 
        <TextBlock Margin="2,2,2,4" Text="{Binding Designator}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate>     
    </ComboBox> 

После предложения, изложенное здесь я добавил настраиваемое свойство поиска, который включал три свойства, которые я хотел искать против. WPF: Changing a ComboBox's ItemTemplate removes the ability to jump down the list as you type. Any way to fix this?

public string SearchText {get { return string.Format("{0} | {1} | {2}", Description, ID, Designator); }} 

Мой вопрос, могу ли я сделать подстановочные или поиск подстроки на моей конкатенации свойств?

ответ

2

Нашли идею из которой я моделируемого мое решение- http://jacobmsaylor.com/?p=17

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

В коде behind-

public SelectRouteSegmentDialog() 
{ 
    InitializeComponent(); 

    LineComboBox.Items.Filter += FilterPredicate; 
} 

private bool FilterPredicate(object obj) 
{ 
    Line line = obj as Line; 
    if (string.IsNullOrEmpty(LineComboBox.Text)) return true; 

    if (line.SearchText != null) 
    { 
     if (line.SearchText.IndexOf(LineComboBox.Text, StringComparison.CurrentCultureIgnoreCase) >= 0) 
     { 
      return true; 
     } 
     return false; 
    } 
    else 
    { 
     //if the string is null, return false 
     return false; 
    } 

} 

private void combobox_KeyUp(object sender, KeyEventArgs e) 
{ 
    if ((e.Key == Key.Enter) || (e.Key == Key.Tab) || (e.Key == Key.Return)) 
    { 
     //Formatting options 
     LineComboBox.Items.Filter = null; 
    } 
    else if ((e.Key == Key.Down) || (e.Key == Key.Up)) 
    { 
     LineComboBox.IsDropDownOpen = true; 
    } 
    else 
    { 
     LineComboBox.IsDropDownOpen = true; 
     LineComboBox.Items.Filter += this.FilterPredicate; 
    } 
} 

И XAML я поставил IsEditable = верно, IsTextSearchEnabled = ложь и TextSearch.TextPath равна пути Я хотел отображается для моего выбранного элемента (в противном случае был показан только ToString). Я также прислушиваюсь к событию ключа -

<ComboBox ItemsSource="{Binding AllLines, Mode=OneWay}" Grid.Column="1" SelectedItem="{Binding SelectedLine}" Margin="4" 
      Visibility="{Binding ShowLines, Converter={StaticResource BoolToVisible}}" AlternationCount="2" 
       IsEditable="True" TextSearch.TextPath="SearchText" IsTextSearchEnabled="False" 
       ItemContainerStyle="{StaticResource alternatingWithTriggers}" x:Name="LineComboBox" KeyUp="combobox_KeyUp"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Margin="2,0,2,0" FontWeight="Bold" Text="{Binding DisplayText}" 
           Visibility="{Binding Description, Converter={StaticResource NullVisibilityConverter}}"></TextBlock> 
        <TextBlock Margin="2,2,2,4" Text="{Binding Designator}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate>     
    </ComboBox> 
1

Мой вопрос: могу ли я сделать подстановочный знак или подстрочный поиск по моей конкатенации свойств?

Не используется встроенный механизм TextSearch; это только префикс. Вы можете напрямую указать текст или указать путь к свойству, содержащему текст (как вы это сделали), но вы не можете изменить соответствующее поведение.

Вам нужно будет реализовать свой собственный механизм поиска текста, чтобы получить желаемое поведение. Попробуйте изучить исходный код TextSearch для идей реализации.

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