Как сохранить отображение выделенного текста в поле со списком? - PullRequest
0 голосов
/ 14 октября 2019

Я создаю комбинированный список выбора цвета с флажками.

Текст в поле со списком отображается как «Цвета», а элементы - это названия цветов с флажком.

Сценарий: открытый комбинированный список -> выбрать что-либо в comboboxItems -> получить отмеченные (выбранные) элементы.

Итак, когда пользователь щелкает элемент списка со списком, я хочу изменить значение флажка и оставить этот список открытым.

IЗастрял с проверкой (выбором) пунктов функциональности.

Как это сделать?

Модель:

public class ColorItem : DependencyObject
{
    public static readonly DependencyProperty NameProperty =
        DependencyProperty.Register
        ("Name", typeof(string), typeof(ColorItem),
        new PropertyMetadata(string.Empty));

    public static readonly DependencyProperty IsSelectedProperty =
        DependencyProperty.Register
        ("IsSelected", typeof(bool), typeof(ColorItem),
        new PropertyMetadata(true));

    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }
    public bool IsSelected
    {
        get { return (bool)GetValue(IsSelectedProperty); }
        set { SetValue(IsSelectedProperty, value); }
    }
}

XAML:

<ComboBox Name="ColorCombobox" IsEditable="True" IsReadOnly="True" Focusable="False" StaysOpenOnEdit="True"
            ItemsSource="{Binding ColorItems}" SelectionChanged="OnComboboxSelectionChanged" Text="Colors" Margin="0,0,30,0" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected}" Width="20" />
                <TextBlock Text="{Binding ColorName}" Width="100" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

SelectionChanged Обработчик события в коде позади:

private void OnComboboxSelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    ComboBox box = sender as ComboBox;

    box.Text = "Colors"; //Not works. Text  will empty be "" 
}

1 Ответ

3 голосов
/ 14 октября 2019

Избавьтесь от StackPanel и TextBlock и определите ItemContainerStyle, который растягивает содержимое ComboBoxItem:

<ComboBox Name="ColorCombobox" IsEditable="True" IsReadOnly="True" Focusable="False" StaysOpenOnEdit="True"
          ItemsSource="{Binding ColorItems}" SelectionChanged="OnComboboxSelectionChanged" Text="Colors" Margin="0,0,30,0" >
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsSelected}" Content="{Binding Name}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...