Доступно ли какое-либо родное поле со списком WPF Multiselect?

Подойдет даже сторонний.

Спасибо


person Amit Sharma    schedule 03.02.2009    source источник


Ответы (7)


В WPF нет собственного поля со списком с множественным выбором. Пожалуйста, проверьте мой блог на предмет простого хака, использующего смесь выражений для получения множественного выбора в поле со списком. http://jobijoy.blogspot.com/2009/02/simple-multiselect-combobox-using.html Идея состоит в том, чтобы использовать функцию множественного выбора ListBox в ComboBox путем редактирования шаблона элемента управления.

Но для доступа к выбранным элементам вам может понадобиться использовать следующую строку в коде.

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

Где cmbBox – это поле со списком, а lstBox – это ListBox внутри панели управления.

person Jobi Joy    schedule 03.02.2009

Я не уверен, как ComboBox будет отображать данные таким образом, поскольку он разработан как элемент управления с одним выбором.

Может быть, вы ищете что-то вроде ListBox или ListView с SelectionMode из Multiple или Extended?

<ListBox SelectionMode="Multiple" />

<ListBox SelectionMode="Extended" />
person Adrian    schedule 03.02.2009

Я использовал расширитель и заполнил заголовок расширителя выбором, а содержимое - списком. Поле со списком привязано к коллекции. Всякий раз, когда пользователь делает выбор, я обновляю заголовок, чтобы показать, что выбрал пользователь.

person Jas    schedule 16.12.2011

Я нашел эту полезную информацию в Codeproject — ComboBoxMultiSelect

Сам пока не пробовал, но расскажу о своем опыте.

person Shakti Prakash Singh    schedule 24.02.2012
comment
ответ только по ссылке не является хорошим ответом. - person Sinatr; 06.07.2020

Хотя мне еще предстоит заставить это работать, это похоже на то, что мне нужно, и похоже на то, что вы ищете: Блог Just Guy

person Dave    schedule 16.03.2010

На случай, если это кому-нибудь пригодится, я сделал грубый и готовый ComboBox с множественным выбором. В основном просто TextBlock с кнопкой, ListBox и всплывающим окном. Легко построить на я думаю. Настройте работу с выборками в виде списка (из строки), 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
person Mikey    schedule 10.09.2020

Другой CodeProject с подробными объяснениями, как создать ComboBox с несколькими выбираемыми флажками: Multi Select ComboBox в WPF

person Peter Huber    schedule 21.06.2017
comment
ответ только по ссылке не является хорошим ответом. - person Sinatr; 06.07.2020