Подойдет даже сторонний.
Спасибо
Подойдет даже сторонний.
Спасибо
В WPF нет собственного поля со списком с множественным выбором. Пожалуйста, проверьте мой блог на предмет простого хака, использующего смесь выражений для получения множественного выбора в поле со списком. http://jobijoy.blogspot.com/2009/02/simple-multiselect-combobox-using.html Идея состоит в том, чтобы использовать функцию множественного выбора ListBox в ComboBox путем редактирования шаблона элемента управления.
Но для доступа к выбранным элементам вам может понадобиться использовать следующую строку в коде.
((ListBox)cmbBox.Template.FindName("lstBox",cmbBox)).SelectedItems
Где cmbBox – это поле со списком, а lstBox – это ListBox внутри панели управления.
Я не уверен, как ComboBox
будет отображать данные таким образом, поскольку он разработан как элемент управления с одним выбором.
Может быть, вы ищете что-то вроде ListBox
или ListView
с SelectionMode
из Multiple
или Extended
?
<ListBox SelectionMode="Multiple" />
<ListBox SelectionMode="Extended" />
Я использовал расширитель и заполнил заголовок расширителя выбором, а содержимое - списком. Поле со списком привязано к коллекции. Всякий раз, когда пользователь делает выбор, я обновляю заголовок, чтобы показать, что выбрал пользователь.
Я нашел эту полезную информацию в Codeproject — ComboBoxMultiSelect а>
Сам пока не пробовал, но расскажу о своем опыте.
Хотя мне еще предстоит заставить это работать, это похоже на то, что мне нужно, и похоже на то, что вы ищете: Блог Just Guy
На случай, если это кому-нибудь пригодится, я сделал грубый и готовый 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
Другой CodeProject с подробными объяснениями, как создать ComboBox с несколькими выбираемыми флажками: Multi Select ComboBox в WPF