Выберите все элементы группы, установив флажок заголовка группы - PullRequest
1 голос
/ 26 марта 2020

Я реализовал пользовательский элемент управления ComboBox, элементы коллекции которого имеют группы. Есть заголовки группы и следующие элементы группы. Выглядит это так:

<Style TargetType="{x:Type GroupItem}" x:Key="ComboBoxNoGroupHeaderStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <ItemsPresenter/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type GroupItem}" x:Key="ComboBoxDefaultGroupHeaderStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <ContentPresenter Grid.Row="0" />
                    <ItemsPresenter Grid.Row="1" Margin="20,0,0,0" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ppstd:ComboBoxHeaderStyleSelector x:Key="ComboBoxGroupStyleSelector"
                                   ComboBoxNoGroupHeaderStyle="{StaticResource ComboBoxNoGroupHeaderStyle}"
                                   ComboBoxDefaultGroupHeaderStyle="{StaticResource ComboBoxDefaultGroupHeaderStyle}"/>
<DataTemplate x:Key="ComboBoxGroupHeaderTemplate">
    <CheckBox Content="{Binding Name}"
              FontWeight="Bold">
    //IsChecked={Binding IsHeaderCheckboxChecked}" tried this but DataContext is type of GroupItem, which has eg. Name property among others
    </CheckBox>
</DataTemplate>

<ComboBox >
    <ComboBox.GroupStyle >
        <GroupStyle
            ContainerStyleSelector = "{StaticResource ComboBoxGroupStyleSelector}"
            HeaderTemplate = "{StaticResource ComboBoxGroupHeaderTemplate}" / >
    </ComboBox.GroupStyle >
</ComboBox>

Выглядит отлично, но при этом не хватает одной функциональности: выбор элементов группы с помощью флажка заголовка группы. Я подумал, что это можно сделать, добавив свойство IsChecked к ComboBoxGroupHeaderTemplate DataTemplate, а затем реализовать эту функцию, когда это свойство установлено, но это не так просто, как я себе представлял. Честно говоря, я застрял в этот момент и не знаю, как дальше go.

Я слышал о Behaviors, но я никогда не использовал это, и я не знаю, что это Хороший способ достичь этого.

Вопрос: возможно ли этого достичь? Если это так, как? Любые идеи будут полезны.

1 Ответ

0 голосов
/ 26 марта 2020

Самый простой и быстрый (на мой взгляд) способ добиться того, что вы описываете, - это использовать привязки:


<CheckBox x:Name="HeadCheckBox" Content="Header" />
<CheckBox Content="CheckBox1" IsChecked="{Binding ElementName=HeadCheckBox, Path=IsChecked, Mode=OneWay}" />
<CheckBox Content="CheckBox2" IsChecked="{Binding ElementName=HeadCheckBox, Path=IsChecked, Mode=OneWay}" />
<CheckBox Content="CheckBox3" IsChecked="{Binding ElementName=HeadCheckBox, Path=IsChecked, Mode=OneWay}" />
<CheckBox Content="CheckBox4" IsChecked="{Binding ElementName=HeadCheckBox, Path=IsChecked, Mode=OneWay}" />

Теперь каждый флажок можно установить отдельно, но при установке или снятии флажка заголовок устанавливаются все связанные флажки. в то же время.

Недостаток этого решения заключается в том, что если отмечена только часть ваших флажков, было бы неплохо видеть заголовок как «неопределенный» (флажки имеют параметр «три состояния»).
Я задал вопрос о том, как получить три-состояние для заголовка ( тройной результат LINQ двоичного списка ). Я еще не уверен, как добавить его в ваше решение, так как даже если флажок «ведомый» не является состоянием из трех состояний, он принимает состояние мастера (также неопределенное состояние). Возможно, здесь может помочь преобразователь значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...