2016-10-20 72 views
2

我有一個ComboBox具有CheckBox ES的項目:將焦點設置到複選框在組合框,以獲得鍵盤控制

<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獲得鍵盤焦點,我可以選擇一個項目向上和向下方向鍵。然後,我可以將焦點切換到CheckBox標籤,並且能夠通過按空間來切換CheckBoxIsChecked狀態。
我正在尋找一個解決方案,可以讓我做同樣的事情,但不需要手動將焦點切換到CheckBox。我期望的行爲是:

  1. 箭頭鍵選擇項目
  2. 選擇狀態空間

我試着用EventTriggerInputBinding,並通過與Focusable財產周圍擺弄做,但沒有運氣。
我寧願在xaml的解決方案,但仍然不理解代碼隱藏解決方案。

回答

1

看看這個Q&A(由Sheridan提供答案)

的想法是設置CheckBoxFocusManager.FocusedElement

這裏的區別在於複選框的DataTemplate的一部分,有必要檢查IsFocused組合框的屬性

<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

它可以工作,但我不太清楚爲什麼。從看它的角度來看,每當'ComboBox'聚焦時,每個'CeckBox'都會試圖獲得焦點。但是隻有選定的人才能真正獲得焦點。這是因爲所有其他的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模式。你可以做的是在ViewModel中使用RelayCommand(很好的教程here),當你得到焦點時會被觸發。然後,當你獲得焦點時,你可以從你的ViewModel設置你的複選框的新焦點。如果我錯了,請糾正我,因爲我對WPF很陌生,但希望有所幫助!

+0

我沒有特定的'ComboBoxItem'因爲我使用了'DataTemplate'。 –

+0

是的,我已經說過這個例子可能不起作用,但它可能會讓你知道如何使用MVVM和數據綁定來解決它。如果你有一個ViewModel這兩個項目,那麼你可以將gotfocus命令綁定到你的ViewModel並且用它玩弄 – Markinson