是否有任何可用的原生 WPF 多选组合框?

Posted

技术标签:

【中文标题】是否有任何可用的原生 WPF 多选组合框?【英文标题】:Is there any native WPF Multiselect combobox available? 【发布时间】:2010-10-05 05:49:48 【问题描述】:

即使是第 3 方也可以。

谢谢

【问题讨论】:

【参考方案1】:

我不确定ComboBox 将如何以这种方式显示数据,因为它被设计为单选控件。

也许您正在寻找类似ListBoxListViewSelectionModeMultipleExtended 之类的东西?

<ListBox SelectionMode="Multiple" />

<ListBox SelectionMode="Extended" />

【讨论】:

【参考方案2】:

WPF 中没有原生多选组合框。请查看我的博客,了解使用表达式混合在组合框上实现多选的简单技巧。 http://jobijoy.blogspot.com/2009/02/simple-multiselect-combobox-using.html 这个想法是通过编辑控件模板来利用ListBox的Multi-Selection功能到ComboBox中。

但要访问选定的项目,您可能需要使用代码中的下面一行。

((ListBox)cmbBox.Template.FindName("lstBox",cmbBox)).SelectedItems

cmbBox 是您的组合框,lstBox 是控件模板内的 ListBox。

【讨论】:

【参考方案3】:

虽然我还没有让它工作,但这看起来像我需要的并且与您正在寻找的相似:Just Guy's Blog

【讨论】:

【参考方案4】:

我使用了扩展器,并在扩展器的标题中填充了所选内容,并用列表框填充了内容。列表框绑定到一个集合。每当用户进行选择时,我都会更新标题以显示用户选择的内容。

【讨论】:

【参考方案5】:

我从 Codeproject - ComboBoxMultiSelect 找到了这些有用的信息

我自己还没有尝试过,但会告诉我我的经验。

【讨论】:

Link-only answer 不是一个好的答案。【参考方案6】:

另一个 CodeProject 详细解释了如何创建具有多个可选复选框的 ComboBox: Multi Select ComboBox in WPF

【讨论】:

Link-only answer 不是一个好的答案。【参考方案7】:

如果它对任何人有用,我已经制作了一个粗略且现成的多选组合框。 基本上只是一个带有按钮、列表框和弹出窗口的文本块。我认为很容易建立。 设置为使用选择作为列表(字符串),itemsSource 作为列表(字符串),并引发 selectionsChanges 事件。

XAML:(不包括设计尺寸的用户控件)

<Grid Margin="0,4,0,0">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="18"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Border x:Name="bdr" BorderBrush="Gray" BorderThickness="1" Grid.ColumnSpan="2"/>
    <TextBlock x:Name="txtValues" MinWidth="50" Background="#F0F0F0" Margin="1,1,0,1" Padding="3,1,0,1">
        <TextBlock.ContextMenu><ContextMenu><MenuItem Header="Clear" Click="clearItems"/></ContextMenu></TextBlock.ContextMenu>
    </TextBlock>
    <Button Grid.Column="1" Click="showListBox">
        <Polygon Points="0,2 12,2 6,8" Fill="Black"/>
    </Button>
    <Popup x:Name="pop" StaysOpen="False" Grid.ColumnSpan="2"
           PlacementTarget="Binding ElementName=bdr" Closed="pop_Closed">
        <ListBox x:Name="items" SelectionMode="Extended"
                 Width="Binding ElementName=bdr,Path=ActualWidth"/>
    </Popup>
</Grid>

和代码..

Public Class multiCombo
Private _itemsSource As List(Of String)
Private _selections As List(Of String)
Public Event selectionsChanges(sender As Object, e As EventArgs)
Public Property selections As List(Of String)
    Get
        Return _selections
    End Get
    Set
        _selections = Value
        For Each itm In items.Items
            If Value.Contains(itm) Then
                If Not items.SelectedItems.Contains(itm) Then items.SelectedItems.Add(itm)
            Else
                If items.SelectedItems.Contains(itm) Then items.SelectedItems.Remove(itm)
            End If
        Next
        txtValues.Text = String.Empty
        For Each itm In Value
            If txtValues.Text.Length > 0 Then txtValues.Text += ", "
            txtValues.Text += itm
        Next
    End Set
End Property
Public Property itemsSource As List(Of String)
    Get
        Return _itemsSource
    End Get
    Set
        _itemsSource = Value
        items.ItemsSource = Value
    End Set
End Property
Private Sub showListBox(sender As Object, e As RoutedEventArgs)
    pop.IsOpen = True
End Sub
Private Sub pop_Closed(sender As Object, e As EventArgs)
    Dim changed = items.SelectedItems.Count <> selections.Count
    If Not changed Then
        For Each selItm In items.SelectedItems
            If Not selections.Contains(selItm) Then changed = True
        Next
    End If
    If changed Then
        selections.Clear()
        txtValues.Text = String.Empty
        For Each selItm In items.SelectedItems
            selections.Add(selItm)
            If txtValues.Text.Length > 0 Then txtValues.Text += ", "
            txtValues.Text += selItm
        Next
        RaiseEvent selectionsChanges(Me, Nothing)
    End If
End Sub
Private Sub clearItems(sender As Object, e As RoutedEventArgs)
    If selections.Count > 0 Then
        selections.Clear()
        txtValues.Text = String.Empty
        items.SelectedItems.Clear()
        RaiseEvent selectionsChanges(Me, Nothing)
    End If
End Sub
End Class

【讨论】:

以上是关于是否有任何可用的原生 WPF 多选组合框?的主要内容,如果未能解决你的问题,请参考以下文章

WPF组合框:多列宽度

WPF延迟选择中的组合框

如何使用double数组的资源制作一个wpf组合框?

检查多个组合框和文本框的内容

多选组合框 - 必填项

组合框多选以在 Access 2016 中的文本框中显示所选项目