2016-07-22 202 views
0

我正在使用DataTrigger取消选择ComboBoxCheckBox(未选中==取消选中)。 我需要的是什么:WPF取消选择带复选框的复选框 - 复选框组合框

    当我选择的ComboBox一些项目
  1. 然后复选框需要变得 经过。
  2. 当我取消选择复选框,然后ComboBox需要取消选择。如果组合框被取消
  3. 复选框不能被选中(或如果组合框复选框后取消已选中的ComboBox应与第一项选择)

这里是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> 

UPDATE:

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

<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关闭时,将combobox设置为第二项。所以我需要一些线我可以告诉:什么都不做,不取消选择组合框,保持当前状态。

+0

有你避免代码特别的原因?解决方案将无限简单(更不用说单元测试)在ViewModel中。 – benPearce

+0

我想干净的XAML,因为我想为将来制作通用的“复制粘贴”解决方案。所以你认为这是可能的。我有问题,例如:如果我设置复选框未选中状态以取消选择组合框一切工作正常,但每次当我检查复选框时取消选择组合框。不知怎的,当datatrigger的条件为true时,datatrigger可以正常工作,但是当false组合框总是被设置为取消选中状态时(假设它是组合框的默认初始状态)。如果条件为false,我需要在样式触发器中说些什么不要做任何事情保持当前状态。 –

+0

是否有特殊原因,您将组合框放在复选框内?一个'ControlTemplate'在这里会更有意义 – lokusking

回答

0

我找到解决方案,这些功能都满足:

  1. 当我选择从组合框的一些项目,然后复选框需要变得经过。
  2. 当我取消选择复选框,然后ComboBox需要取消选择。
  3. 如果ComboBox处于取消选中状态,并且CheckBox被选中,则应该使用第一项选择组合框(如果项存在其他位置,CheckBox保持选中状态并取消选择组合框)。

这里是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为空的组合框都什么需要做的是简单的替换与XAML高于其XAML代码的现有组合框的标签和更改X:名称和的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">