Пустое свойство текста 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;
}
Другие вопросы по тегам