将焦点设置为ComboBox中的Checkbox以获得键盘控制

时间:2016-10-20 08:19:08

标签: c# wpf xaml checkbox combobox

我有app.UseExceptionHandler ComboBox项为

CheckBox

如果<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标签,然后按 space 切换CheckBox的{​​{1}}状态。
我正在寻找一种解决方案,允许我做同样的事情,但无需手动将焦点切换到CheckBox。我希望的行为是:

  1. 选择带箭头键的项目
  2. 使用 space
  3. 选择州

    我尝试使用IsCheckedCheckBox以及摆弄EventTrigger属性,但没有运气。
    我更喜欢InputBinding中的解决方案,但仍然会感谢代码隐藏解决方案。

2 个答案:

答案 0 :(得分:1)

查看此Q&ASheridan提供的答案)

我们的想法是将CheckBox设置为FocusManager.FocusedElement

这里的区别是CheckBox是DataTemplate的一部分,有必要检查ComboBox的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>

答案 1 :(得分: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中使用ViewModel(好的教程here),当你获得焦点时会触发它。然后,当您获得焦点时,您可以在ViewModel的复选框中设置新焦点。如果我错了,请纠正我,因为我对WPF很陌生,但希望有所帮助!