有没有办法在 telerik:RadAutoCompleteBox 中多次 select 一项?
Is there a way to select one item multiple times in the telerik:RadAutoCompleteBox?
我正在尝试制作一个 "code editor" 类控件。我想要已知变量和运算符的自动完成。 RadAutoCompleteBox 几乎完全满足我的需要,它只是从列表中删除 selected 项,因此我可以只使用每个变量或运算符一次。我可以禁用此功能吗?
如前所述,我在 SelectionMode="Multiple" 中使用了 RadAutoCompleteBox,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}”,我希望结果仍然提示“AND”运算符
经过一天的广泛研究,我找到了一个简单的解决方案:创建自定义筛选。
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>;
}
}
并将其连接到您的自动完成框:
<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>
这允许您多次 select 项目并获得一个 ObservableCollection。完成后看起来不正确(显然 telerik 只是调用 'ToString' 方法来显示列表)所以我自己制作了
class StringList : ObservableCollection<string>
{
public override string ToString()
{
if(this.Count == 0)
{
return string.Empty;
}
return string.Join(" ", this);
}
}
希望这对某人有所帮助,因为我花了大约 2 天的时间才弄明白。
我正在尝试制作一个 "code editor" 类控件。我想要已知变量和运算符的自动完成。 RadAutoCompleteBox 几乎完全满足我的需要,它只是从列表中删除 selected 项,因此我可以只使用每个变量或运算符一次。我可以禁用此功能吗?
如前所述,我在 SelectionMode="Multiple" 中使用了 RadAutoCompleteBox,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}”,我希望结果仍然提示“AND”运算符
经过一天的广泛研究,我找到了一个简单的解决方案:创建自定义筛选。
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>;
}
}
并将其连接到您的自动完成框:
<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>
这允许您多次 select 项目并获得一个 ObservableCollection。完成后看起来不正确(显然 telerik 只是调用 'ToString' 方法来显示列表)所以我自己制作了
class StringList : ObservableCollection<string>
{
public override string ToString()
{
if(this.Count == 0)
{
return string.Empty;
}
return string.Join(" ", this);
}
}
希望这对某人有所帮助,因为我花了大约 2 天的时间才弄明白。