如何配置Telerik RadComboBox的MultipleSelectionBoxTemplate以访问选中项属性
解决Telerik RadComboBox多选时选中项显示异常问题
问题根源
- 启用多选(
IsMultipleSelection="True")后,MultipleSelectionBoxTemplate的DataContext是RadComboBox控件本身,而非单个Employee对象,直接绑定Lastname会因找不到对应属性导致显示为空。 - 直接绑定
SelectedItems时,仅当集合引用发生变更时才会触发转换器,集合内部元素的增删不会触发绑定更新,因此转换器只执行一次。
正确配置方案
1. 先开启多选模式
确保RadComboBox启用多选功能:
<telerik:RadComboBox x:Name="EmployeeComboBox" IsMultipleSelection="True" ItemsSource="{Binding Employees}">
2. 配置MultipleSelectionBoxTemplate
方案A:自定义转换器监听集合变化
先实现支持集合变更监听的转换器:
public class SelectedItemsToStringConverter : IValueConverter, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var selectedEmployees = value as IEnumerable<Employee>; if (selectedEmployees == null) return string.Empty; // 监听集合元素变化 if (value is INotifyCollectionChanged observableCollection) { observableCollection.CollectionChanged += (s, e) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Convert))); } return string.Join(", ", selectedEmployees.Select(e => e.Lastname)); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
然后在XAML中配置模板,通过RelativeSource绑定到RadComboBox的SelectedItems:
<Window.Resources> <local:SelectedItemsToStringConverter x:Key="SelectionToCustomStringConverter"/> </Window.Resources> <telerik:RadComboBox.MultipleSelectionBoxTemplate> <DataTemplate> <TextBlock Text="{Binding Path=SelectedItems, RelativeSource={RelativeSource AncestorType=telerik:RadComboBox}, Converter={StaticResource SelectionToCustomStringConverter}}"/> </DataTemplate> </telerik:RadComboBox.MultipleSelectionBoxTemplate>
方案B:使用内置简化配置
如果仅需拼接选中项的Lastname,可直接设置DisplayMemberPath,Telerik会自动处理多选显示:
<telerik:RadComboBox x:Name="EmployeeComboBox" IsMultipleSelection="True" ItemsSource="{Binding Employees}" DisplayMemberPath="Lastname"/>
单选场景补充
如果是单选需求,无需使用MultipleSelectionBoxTemplate,改用SelectionBoxTemplate即可:
<telerik:RadComboBox.SelectionBoxTemplate> <DataTemplate> <TextBlock Text="{Binding Lastname}"/> </DataTemplate> </telerik:RadComboBox.SelectionBoxTemplate>
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

