【问题标题】:Select all group items by checking group header checkbox通过选中组标题复选框来选择所有组项目
【发布时间】:2020-03-26 10:26:56
【问题描述】:

我已经实现了自定义 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 来完成,然后在设置此属性时实现此功能,但这并不像我想象的那么简单。老实说,我现在被卡住了,不知道如何走得更远。

我听说过Behaviors,但我从未使用过它,我不知道这是实现它的好方法。

问题是:有可能实现吗?如果是,如何?任何想法都会有所帮助。

【问题讨论】:

    标签: c# wpf combobox


    【解决方案1】:

    实现您所描述的最简单和最快(在我看来)的方法是使用绑定:

    
    <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 ternary result of binary list)。我还不确定如何将它添加到您的解决方案中,因为即使“从”复选框不是三态,它也需要主状态(也是未定义状态)。也许价值转换器可以在这里提供帮助。

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 1970-01-01
      • 2012-12-23
      • 2014-06-20
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多