Есть ли способ выбрать один элемент несколько раз в телерике: RadAutoCompleteBox? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь сделать "редактор кода", как элемент управления. Я хочу автозаполнение для известных переменных и операторов. RadAutoCompleteBox делает почти то, что мне нужно, он просто удаляет выбранные элементы из списка, поэтому я могу использовать каждую переменную или оператор только один раз. Могу ли я отключить эту функцию?

Как уже упоминалось, я использовал RadAutoCompleteBox в SelectionMode = "Multiple" с ItemSource списка всех известных переменных и операторов. Я просто не смог найти опцию включения multi-multi-select.

XAML:

<telerik:GridViewDataColumn.CellEditTemplate>
<DataTemplate>
<telerik:RadAutoCompleteBox SelectedItem="{Binding RecipeCondition, Mode=TwoWay}" ItemsSource="{Binding DataContext.ConditionWordList, RelativeSource={RelativeSource AncestorType=telerik:RadGridView}}" SelectionMode="Multiple" AutoCompleteMode="SuggestAppend" TextSearchMode="Contains">
</telerik:GridViewDataColumn.CellEditTemplate>

Модель просмотра:

 private void initFakeData()
    {
      string[] operators = { " AND ", " OR ", " NOT ", " + " , " - ", " * ", " / ", "=", "!=", ">", "<", ">=", "<=" };
      string[] vars = { "{VAR_1}", "{VAR_2}", "{OTHER_VAR}", "{sumDamnVar}", "{121asdf}", "{121onji}", "{12123}"};
      foreach(string oupii in operators)
      {
        ConditionWordList.Add(oupii);
      }

      foreach (string variable in vars)
      {
        ConditionWordList.Add(variable);
      }
    }
public ObservableCollection<EventWrapper> EventMappingList { get; set; } = new ObservableCollection<EventWrapper>();
public ObservableCollection<string> ConditionWordList{ get; set; } = new ObservableCollection<string>();

Я ожидаю, что в результате все еще будет предложен оператор "И" даже после того, как я набрал "{VAR_1} AND {VAR_2}"

1 Ответ

0 голосов
/ 18 января 2019

Итак, после обширных исследований в течение дня я нашел простое решение: создать собственную фильтрацию.

class ComboBoxLikeFilter : FilteringBehavior, IFilteringBehavior
  {
    public override IEnumerable<object> FindMatchingItems(string searchText, IList items, IEnumerable<object> escapedItems, string textSearchPath, TextSearchMode textSearchMode)
    {
      if (string.IsNullOrWhiteSpace(searchText))
      {
        return ((IEnumerable<object>)items);//.Where(x => !escapedItems.Contains(x));
      }
      return base.FindMatchingItems(searchText, items, new object[0], textSearchPath, textSearchMode) as IEnumerable<object>;
    }
  }

и подключите его к AutoCompleteBox:

<telerik:GridViewDataColumn.CellEditTemplate>
<DataTemplate>
<telerik:RadAutoCompleteBox SelectedItem="{Binding RecipeCondition, Mode=TwoWay}" ItemsSource="{Binding DataContext.ConditionWordList, RelativeSource={RelativeSource AncestorType=telerik:RadGridView}}" SelectionMode="Multiple" AutoCompleteMode="SuggestAppend" TextSearchMode="Contains">
<telerik:RadAutoCompleteBox.FilteringBehavior>
<behavior:ComboBoxLikeFilter/>
</telerik:RadAutoCompleteBox.FilteringBehavior>
</telerik:RadAutoCompleteBox>
</telerik:GridViewDataColumn.CellEditTemplate>

Это позволяет вам выбирать элементы несколько раз и получать коллекцию ObservableCollection. Это не будет выглядеть сразу после того, как вы закончите (очевидно, Telerik просто вызывает метод ToString, чтобы показать список), поэтому я сделал свой собственный

class StringList : ObservableCollection<string>
  {
    public override string ToString()
    {
      if(this.Count == 0)
      {
        return string.Empty;
      }
      return string.Join(" ", this);
    }
  }

Надеюсь, это кому-нибудь поможет, потому что мне понадобилось всего 2 дня, чтобы понять.

...