2016-10-20 7 views
2

を得るために、私はアイテムとしてCheckBox ESを持つComboBoxを持っている:設定したフォーカスキーボード制御

<ComboBox ItemsSource="{Binding SomeCollectionProperty}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding SomeBoolProperty}" Width="20" /> 
       <TextBlock Text="{Binding Name}" Width="140" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

ComboBoxがキーボードフォーカスを取得した場合、私は上下で項目を選択することができます矢印キー。次に、にタブでフォーカスを切り替え、スペースを押して、CheckBoxIsChecked状態を切り替えることができます。
手動でフォーカスをCheckBoxに切り替えることなく、同じことを行うことができるソリューションを探しています。私の希望の動作は次のようになります。

  1. 私はEventTriggerInputBindingとし、Focusable財産の周りいじることによってそれを実行しようとしましたスペース

で状態を選択し、矢印キー

  • で項目を選択してくださいが、運がない。
    私はxamlで解決策を望んでいますが、コードビハインドソリューションは依然として高く評価されます。

  • 答えて

    1

    アイデアがここにCheckBox

    FocusManager.FocusedElementなどの違いを設定することです

    をこのQ&ASheridanが提供する答え)を見てみましょうチェックボックスがDataTemplateの一部であり、IsFocusedをチェックする必要があるということですComboBoxのプロパティ

    <CheckBox.Style> 
        <Style TargetType="CheckBox"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding IsFocused, RelativeSource={RelativeSource AncestorType=ComboBox}}" Value="True"> 
           <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
    </CheckBox.Style> 
    
    +0

    これは動作しますが、なぜそれほど確実ではないのですか。ちょうどそれを見ると、 'CeckBox'が' ComboBox'がフォーカスされているときは常にフォーカスを取得しようとするように見えます。しかし、選択されたものだけが実際に焦点を当てます。これは他の 'CheckBox'がすべて' Collapsed'なので、フォーカスを描くことができないからですか? –

    0

    私は次のことを試してみました:

    <ComboBoxItem GotFocus="ComboBoxItem_GotFocus"> 
         <StackPanel Orientation="Horizontal"> 
          <CheckBox Name="test" Width="20" Height="20" /> 
          <TextBlock Width="140" /> 
         </StackPanel> 
    </ComboBoxItem> 
    

    のC#:

    private void ComboBoxItem_GotFocus(object sender, RoutedEventArgs e) 
    { 
        test.Focus(); 
    } 
    

    これは私のために働きました。 これは正しく表示されているため、MVVMパターンを使用しようとしているため、これがおそらくあなたの状況ではうまくいかないことを理解しています。あなたができることは、のRelayCommand(良いチュートリアルhere)を使用してフォーカスを取得したときにトリガーされます。フォーカスが得られたら、ViewModelからチェックボックスに新しいフォーカスを設定することができます。私が間違っていると私は正しいです。私はWPFの新機能ですから、助けてください!

    +0

    私が 'DataTemplate'を使用しているため、特定の' ComboBoxItem'がありません。 –

    +0

    ええ、私はすでに、この例がうまくいかないと言っていますが、MVVMとデータバインディングを使って解決する方法を知っているかもしれません。これらの2つの項目を持つViewModelを持っている場合は、gotfocusコマンドをViewModelにバインドして、それを再生することができます。 – Markinson

    関連する問題