Пустое свойство текста WPF ComboBox с ItemTemplate
У меня есть ComboBox, который использует ItemTemplate, состоящий из CheckBox и TextBlock. Моя цель состоит в том, чтобы, когда элементы отмечены / не отмечены, свернутый комбинированный список отображает разделенный запятыми список проверенных элементов. Я думал, что свойство Text ComboBox можно использовать для этой цели, но оно включается только тогда, когда IsEditable = true, в противном случае оно просто пусто, даже когда привязано к свойству. Я не хочу, чтобы комбо было редактируемым.
Было бы неплохо, если бы я мог предоставить какой-то простой шаблон для отображения свойства, состоящего из отмеченных элементов из списка. Это возможно?
<ComboBox ItemsSource="{Binding Issues}" Text="{Binding IssuesCSV}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" Margin="4 0 4 0"
IsEnabled="{Binding IsEnabled}" />
<TextBlock Text="{Binding Issue.Number}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
1 ответ
Ваше желаемое поведение достаточно отличается от ComboBox, поэтому вы можете подумать о создании собственного элемента управления.
Но... я думаю, что есть способ получить то, что вы хотите от ComboBox
Сначала создайте ресурс VisualBrush и привяжите его к значению IssuesCSV:
<Window.Resources>
<VisualBrush x:Key="TextBrush" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock Text="{Binding IssuesCSV}"/>
</VisualBrush.Visual>
</VisualBrush>
</Window.Resources>
Затем установите свойство background вашего ComboBox для использования этого ресурса кисти:
<ComboBox ... Background="{StaticResource TextBrush}" ... />
Затем установите ComboBox для редактирования, но только для чтения. Это позволит серебряному стилю по умолчанию для нередактируемого ComboBox скрыть текст во время выпадающего меню: (Возможно, вы также можете поиграть со стилем ComboBox, чтобы добиться этого, при этом оставляя ComboBox действительно недоступным для редактирования)
<ComboBox ... IsReadOnly="True" IsEditable="True" ... />
Наконец, не позволяйте пользователю фактически выбирать ComboBoxItem, предоставляя обработчик для события SelectionChanged, который просто возвращает SelectedItem обратно в нуль:
<ComboBox ... SelectionChanged="myCB_SelectionChanged" ... />
private void myCB_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
myCB.SelectedItem = null;
}