我有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
。我希望的行为是:
我尝试使用IsChecked
和CheckBox
以及摆弄EventTrigger
属性,但没有运气。
我更喜欢InputBinding
中的解决方案,但仍然会感谢代码隐藏解决方案。
答案 0 :(得分:1)
我们的想法是将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很陌生,但希望有所帮助!