我想用telerik创建多选组合框控件。我发现的样本在下一个链接中:https://docs.telerik.com/devtools/wpf/controls/radcombobox/features/multiple-selection
所以,我这样创建它:
<telerik:RadComboBox x:Name="radComboBox" AllowMultipleSelection="True" Height="30" Width="300" MultipleSelectionBoxTemplate="{StaticResource EmptyTemplate}">
<telerik:RadComboBoxItem Content="Alapattah" />
<telerik:RadComboBoxItem Content="Brickell Avenue" />
<telerik:RadComboBoxItem Content="Downtown Miami" />
<telerik:RadComboBoxItem Content="El Portal" />
</telerik:RadComboBox>
结果是应该的;结果";组合框的一部分,当它关闭时。现在,如果我选择Alapattah和El Portal,组合框的值将是Alapattah,El Portal,我想让它看起来像AL,EP。
所以我创建了新的Model,有两个属性ID和Name,设置在组合框DisplayMemberPath="中;名称";SelectedValuePath=";ID";,但结果仍然相同,它只从DisplayMemberPath中获取值。
此多选有一个数据模板:
<DataTemplate x:Key="EmptyTemplate">
<TextBlock FontWeight="Bold" FontFamily="Comic Sans" FontStyle="Italic" Text="{Binding}" />
</DataTemplate>
通过这种方式,我可以获得类似WpfApp1.Item、WpfApp1.Item…的组合框结果
如果我设置Text=";{绑定名称}";我一无所获。
以下是完整的代码预览:
<Window x:Class="WpfApp10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:local="clr-namespace:WpfApp10"
mc:Ignorable="d"
Title="MainWindow"
Height="450"
Width="800">
<Grid>
<Grid.Resources>
<DataTemplate x:Key="EmptyTemplate">
<TextBlock FontWeight="Bold" FontFamily="Arial" FontStyle="Italic" Text="{Binding Name}" />
</DataTemplate>
</Grid.Resources>
<telerik:RadComboBox x:Name="radComboBox"
AllowMultipleSelection="True"
Height="30"
Width="300"
MultipleSelectionBoxTemplate="{StaticResource EmptyTemplate}">
</telerik:RadComboBox>
</Grid>
</Window>
那么,有没有什么方法可以实现这一点,也许是一些自定义模板?
多选场景中组合框中显示的选定值实际上是一个字符串,表示连接的选定项目。您可以在RadComboBox的SelectionBoxItem或Text属性中找到此值。
根据具体情况,字符串将包含不同的值。例如,如果像在第一个代码片段中那样直接用RadComboBoxItems填充控件,则将使用每个项的Content属性。如果使用ItemsSource,则字符串将来自DisplayMemberPath所指向的属性。如果未定义DisplayMemberPath,则使用相应类(来自ItemsSource(的.ToString((实现。这就是为什么你得到";WpfApp1.Item,WpfApp1.Item…";在最后一种情况下。
为了满足您的需求,您可以使用MultipleSelectionBoxTemplate、SelectionBoxItem和IValueConverter。
<FrameworkElement.Resources>
<local:SelectionToCustomStringCoverter x:Key="SelectionToCustomStringCoverter" />
</FrameworkElement.Resources>
<!-- -->
<telerik:RadComboBox x:Name="radComboBox" AllowMultipleSelection="True">
<telerik:RadComboBox.MultipleSelectionBoxTemplate>
<DataTemplate>
<TextBlock Text="{Binding ElementName=radComboBox, Path=SelectionBoxItem, Converter={StaticResource SelectionToCustomStringCoverter}}" />
</DataTemplate>
</telerik:RadComboBox.MultipleSelectionBoxTemplate>
</telerik:RadComboBox>
IValueConverter应该看起来像这样:
public class SelectionToCustomStringCoverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string originalData = (string)value;
string newData = // modify the original string
return newData;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}