WPF 取消选择 ComboBox with CheckBox - ComboBox with reset item

WPF deselect ComboBox with CheckBox - ComboBox with reset item

我正在使用 DataTrigger 去 select ComboBoxCheckBox(未选中 == deselected)。 我需要的是:

  1. 当我 select ComboBox 中的某些项目时,CheckBox 需要变为 已检查。
  2. 当我取消选中 CheckBox 时,ComboBox 需要删除select。
  3. 如果 ComboBox 被删除select,则无法检查 CheckBox(或者如果 ComboBox 在 CheckBox 被删除后被删除select,ComboBox 应该 select 与第一项一起编辑)

这里是 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" /> 行。如果我删除它,那么当数据触发关闭时 ComboBox 被取消 selected 但如果我保留它,那么当数据触发关闭时组合框被设置为第二项。所以我需要一些我可以告诉的行:什么都不做,不要 deselect 组合框,保持当前状态。

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

  1. 当我 select ComboBox 中的某些项目时,CheckBox 需要变为已选中。
  2. 当我取消选中 CheckBox 时,ComboBox 需要删除select。
  3. 如果 ComboBox 处于 deselected 状态,并且当 CheckBox 被选中时,ComboBox 应该 selected 与第一个项目(如果项目存在于其他地方 CheckBox 保持选中并且 ComboBox deselected).

这里是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 标记,并更改 ComboBox 的 x:Name 和 ElementName在这些行中到原始组合框:

<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">