2016-07-22 260 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">