WPF取消选中带CheckBox的ComboBox - ComboBox并重置项

时间:2016-07-22 15:01:46

标签: wpf xaml checkbox combobox datatrigger

我正在使用DataTrigger取消选择ComboBox CheckBox(未选中==取消选中)。 我需要的是:

  1. 当我从ComboBox中选择一些项目时,CheckBox需要成为 检查。
  2. 当我取消选中CheckBox时,ComboBox需要取消选择。
  3. 如果取消选择ComboBox,则无法检查CheckBox(或者如果在选中CheckBox后取消选择ComboBox,则应选择第一个项目选择ComboBox)
  4. 这是XAML(这是工作版本,需要更改)。解决方案必须是纯XAML(无C#代码)!

     <CheckBox HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" Margin="90,519,13,0" VerticalAlignment="Top" Height="21" Width="Auto">
    
    
    <CheckBox.Style>
        <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}">
            <Style.Resources>
                <Style TargetType="Path">
                    <Setter Property="FlowDirection" Value="LeftToRight" />
                </Style>
                <Style TargetType="TextBlock">
                    <Setter Property="FlowDirection" Value="LeftToRight" />
                </Style>
            </Style.Resources>
    
            <Setter Property="FlowDirection" Value="RightToLeft" />
            <!--<Setter Property="IsChecked" Value="True" />
                                                                <Style.Triggers>
                                                                    <DataTrigger Binding="{Binding SelectedItem, ElementName=comboBoxEventDevice, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
                                                                        <Setter Property="IsChecked" Value="False" />
                                                                    </DataTrigger>
                                                                </Style.Triggers>-->
        </Style>
    </CheckBox.Style>
    <ComboBox x:Name="comboBoxEventDevice" FlowDirection="LeftToRight" SelectionChanged="comboBoxEventDevice_SelectionChanged" Width="Auto">
        <ComboBox.Style>
            <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
                <Setter Property="SelectedIndex" Value="1" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Value="True">
                        <Setter Property="SelectedIndex" Value="0" />
                    </DataTrigger>
                    <!--<DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Value="False">
                                                                            <Setter Property="SelectedIndex" Value="1" />
                                                                        </DataTrigger>-->
                </Style.Triggers>
            </Style>
        </ComboBox.Style>
    </ComboBox>
    </CheckBox>
    

    更新:

    我尝试不使用嵌套控件(复选框内的组合框),所以我改变了XAML,一切都和以前一样:

    <CheckBox x:Name="checkBoxEventDevice" Margin="70,600,13,0" VerticalAlignment="Top" Height="21"/>
                                                    <ComboBox x:Name="comboBoxEventDevice" Margin="90,519,10,0" VerticalAlignment="Top" SelectionChanged="comboBoxEventDevice_SelectionChanged">
                                                         <ComboBox.Style>
                                                            <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
                                                                <Setter Property="SelectedIndex" Value="1" />
                                                                <Style.Triggers>
                                                                    <!--<DataTrigger Binding="{Binding Path=IsChecked, ElementName=checkBoxEventDevice}" Value="True">
                                                                        <Setter Property="SelectedIndex" Value="0" />
                                                                    </DataTrigger>-->
                                                                    <DataTrigger Binding="{Binding Path=IsChecked, ElementName=checkBoxEventDevice}" Value="false">
                                                                        <Setter Property="SelectedIndex" Value="-1" />
                                                                    </DataTrigger>
                                                                </Style.Triggers>
                                                            </Style>
                                                        </ComboBox.Style>
                                                    </ComboBox>
    

    问题出在<Setter Property="SelectedIndex" Value="1" />行。如果我删除它,那么当datatrigger关闭时取消选择ComboBox,但是如果我保留它,那么当datatrigger关闭时,组合框被设置为第二个项目。所以我需要一些我能分辨的行:什么都不做,不要取消选择组合框,保持当前状态。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案并且满足了这些功能:

  1. 当我从ComboBox中选择一些项目时,CheckBox需要成为Checked。
  2. 当我取消选中CheckBox时,ComboBox需要取消选择。
  3. 如果ComboBox处于取消选择状态,并且当CheckBox处于Checked状态时,应选择第一个项目的ComboBox(如果其他位置存在项目,则CheckBox保持选中状态并取消选择ComboBox)。
  4. 这是XAML:

                                                    <CheckBox HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" Margin="90,519,13,0" VerticalAlignment="Top" Height="21">
                                                        <CheckBox.Style>
                                                            <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}">
                                                                <Style.Resources>
                                                                    <Style TargetType="Path">
                                                                        <Setter Property="FlowDirection" Value="LeftToRight" />
                                                                    </Style>
                                                                    <Style TargetType="TextBlock">
                                                                        <Setter Property="FlowDirection" Value="LeftToRight" />
                                                                    </Style>
                                                                </Style.Resources>
                                                                <Setter Property="FlowDirection" Value="RightToLeft" />
                                                                <Setter Property="IsChecked" Value="True" />
                                                                <Style.Triggers>   
                                                                    <DataTrigger Binding="{Binding Path=SelectedIndex, ElementName=comboBoxEventDevice}" Value="-1">
                                                                        <Setter Property="IsChecked" Value="False" />
                                                                    </DataTrigger>
                                                                </Style.Triggers>
                                                            </Style>
                                                        </CheckBox.Style>
                                                        <ComboBox x:Name="comboBoxEventDevice" FlowDirection="LeftToRight" SelectionChanged="comboBoxEventDevice_SelectionChanged">
                                                            <ComboBox.Style>
                                                                <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
                                                                    <Setter Property="SelectedIndex" Value="0" />
                                                                    <Style.Triggers>
                                                                        <DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Value="False">
                                                                            <Setter Property="SelectedIndex" Value="-1" />
                                                                        </DataTrigger>
                                                                    </Style.Triggers>
                                                                </Style>
                                                            </ComboBox.Style>
                                                        </ComboBox>
                                                    </CheckBox>
    

    现在,如果有人需要WPF可空的ComboBox,那么需要做的就是简单地用上面的XAML替换其XAML代码中的现有Combobox标签,并将这些行中的x:ComboBox的Name和ElementName更改为原始的ComboBox:

    <DataTrigger Binding="{Binding Path=SelectedIndex, ElementName=comboBoxEventDevice}" Value="-1">
    
    <ComboBox x:Name="comboBoxEventDevice" FlowDirection="LeftToRight" SelectionChanged="comboBoxEventDevice_SelectionChanged">
    

    还应更改或删除SelectionChanged="comboBoxEventDevice_SelectionChanged"的回调,具体取决于您是否需要事件处理。 需要将CheckBox的边距更改为边距(并且可能需要添加Width属性,但这取决于您的项目):

    <CheckBox HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" Margin="90,519,13,0" VerticalAlignment="Top" Height="21">