c# WPF Telerik combobox 多选自定义显示值

Posted

技术标签:

【中文标题】c# WPF Telerik combobox 多选自定义显示值【英文标题】:c# WPF Telerik combobox multiselect custom display value 【发布时间】:2021-07-31 21:52:14 【问题描述】:

我想用 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。

所以我创建了新模型,在组合框中设置了 2 个属性 ID 和名称,DisplayMemberPath="Name" SelectedValuePath="ID",但结果仍然相同,它只从 DisplayMemberPath 中获取值。

这个多选有一个DataTemplate:

<DataTemplate x:Key="EmptyTemplate">
<TextBlock FontWeight="Bold" FontFamily="Comic Sans" FontStyle="Italic" Text="Binding" />
</DataTemplate>

这样我可以得到 WpfApp1.Item、WpfApp1.Item 等组合框结果...

如果我设置 Text="Binding Name" 我什么也得不到。

这是完整的代码预览:

<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>

那么,有什么方法可以实现这一点,也许是一些自定义模板?

【问题讨论】:

MultipleSelectionBoxTemplate 属性有什么问题? 我已经编辑了我的问题,抱歉我没有写下所有信息。 如果您将Binding 更改为Binding YourProperty 会怎样,其中YourProperty 是返回您想要显示的任何内容的项目的属性? 当我改变它时,我什么也得不到。我什至创建了一个转换器,它得到的值是字符串“WpfApp1.Item”,它不是一个对象。 你应该可以在MultipleSelectionBoxTemplate中绑定到SelectedItems 【参考方案1】:

在多选场景中,组合框中显示的选中值实际上是单个字符串,表示串联的选中项。您可以在 RadComboBox 的 SelectionBoxItem 或 Text 属性中找到该值。

根据具体情况,字符串将包含不同的值。例如,如果您像在第一个代码 sn-p 中那样直接使用 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();
    

【讨论】:

以上是关于c# WPF Telerik combobox 多选自定义显示值的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF - 组合框

如何从选定的 WPF ComboBox 项 C# 中显示内容

c# WPF listview的一列里面放着combobox 我在后台给combobox加了几个item,现在不显示。

WPF C# 在运行时将文本和图像添加到 ComboBox

c# WPF listview里有一列的内容是combobox,combobox的初始状态是不可用,通过一个编辑点击使combo变可用

C# WPF ComboBox - 排除绑定数据的最后一行(或空格)(从 Microsoft Access 绑定)