【问题标题】:Is there a way to select one item multiple times in the telerik:RadAutoCompleteBox?有没有办法在 Telerik:RadAutoCompleteBox 中多次选择一个项目?
【发布时间】:2019-06-11 21:38:27
【问题描述】:

我正在尝试制作一个类似控件的“代码编辑器”。我想要已知变量和运算符的自动完成。 RadAutoCompleteBox 几乎完全符合我的需要,它只是从列表中删除选定的项目,因此我只能使用每个变量或运算符一次。我可以禁用此功能吗?

如前所述,我使用了 SelectionMode="Multiple" 中的 RadAutoCompleteBox 和一个包含所有已知变量和运算符列表的 ItemSource。我只是找不到启用多选的选项。

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}”之后,结果仍然会建议使用“AND”运算符

【问题讨论】:

    标签: c# xaml autocomplete telerik


    【解决方案1】:

    所以经过一天的广泛研究,我找到了一个简单的解决方案:创建自定义过滤。

    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 天的时间才弄清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多