2016-07-22 16 views
0

を使用してComboBoxCheckBox(未チェック==選択解除)の選択を解除します。何が必要 は次のとおりです。WPFはチェックボックス付きコンボボックスをコンボボックスから選択解除します - リセット項目付きコンボボックス

  1. 私はチェックボックスがオンになっ する必要があり、その後のComboBoxからいくつかの項目を選択したとき。
  2. チェックボックスのチェックを外すと、コンボボックスは選択を解除する必要があります。
  3. コンボボックスが選択解除された(またはコンボボックスの選択が解除された場合にチェックボックスがチェックされた後、コンボボックスが最初の項目で選択しなければならない)場合は、チェックボックスは

確認することはできませんここで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を変更する前と同じである:

<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は、datatriggerがオフのときに選択解除されますが、それを保持すると、datatriggerがオフのときにコンボボックスが2番目の項目に設定されます。だから私は私が言うことができるいくつかの行が必要です:何もしない、コンボボックスの選択を解除しないで、現在の状態を維持する。

+0

あなたがコードを避けている特定の理由はありますか?ソリューションは、ViewModelで無限にシンプルになります(ユニットテスト可能はもちろん)。 – benPearce

+0

将来的に普遍的な "コピー&ペースト"ソリューションを作成したいので、私はクリーンなXAMLが必要です。だからあなたはこれが可能だと思いますか?私は問題を抱えています:私はチェックボックスをチェックしない状態をコンボボックスを選択解除するとすべてうまく動作しますが、毎回チェックボックスをチェックするとコンボボックスが選択解除されます。何らかの形でdatatriggerの条件がtrueの場合、datatriggerはうまく動作しますが、falseの場合、コンボボックスは常に非選択状態に設定されます(コンボボックスのデフォルトの初期状態であるとします)。条件が偽であれば、スタイルトリガーで何か言いたいことがありますが、現在の状態をそのまま維持しないでください。 –

+0

特別な理由はありますか?コンボボックスをチェックボックスの中に入れましたか? 'ControlTemplate'はここでもっと意味をなさないでしょう – lokusking

答えて

0

私は解決策を発見し、これらの機能が満たされている:

  1. 私はコンボボックスからいくつかの項目を選択すると、次にチェックボックスがオンになるために必要に。
  2. チェックボックスのチェックを外すと、コンボボックスは選択を解除する必要があります。
  3. ComboBoxが非選択状態で、CheckBoxがCheckedの場合、ComboBoxは最初の項目で選択する必要があります(項目が他の場所に存在する場合、CheckBoxはチェックされたままで、ComboBoxは選択解除されます)。ここで

XAMLです:誰かがWPF NULL可能コンボボックスが必要な場合は

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

は今何をすべきか、すべては、上記の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"のコールバックを使用すると、イベント処理を必要としたりしていない変更またはによって除去されなければなりません。行のチェックボックスの 余白余白に変更する必要がある(そして多分あなたはWidthプロパティを追加する必要がありますが、それはあなたのプロジェクトに依存します):

<CheckBox HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" Margin="90,519,13,0" VerticalAlignment="Top" Height="21"> 
関連する問題