Я пытаюсь что-то, что мне показалось довольно простым. Я хочу, чтобы граница в моей сетке появлялась всякий раз, когда фокус клавиатуры находится внутри сетки.
Но привязка не работает, и я не могу определить, что с ней не так. Я надеюсь, что кто-то может определить, где я ошибся.
Я создал простое тестовое приложение, чтобы проиллюстрировать проблему. Вот содержимое окна
<StackPanel>
<!-- This text box is just so that something else can have focus at times -->
<TextBox Width="200" Height="20"/>
<!--
This grid should show its border whenever keyboard focus is within
I even have an event handler dumping out the new value of when it changes.
-->
<Grid x:Name="DetailGrid"
Width="400" Height="400" Focusable="True"
IsKeyboardFocusWithinChanged="DetailGrid_OnIsKeyboardFocusWithinChanged">
<Border BorderBrush="White" BorderThickness="0" >
<Border.Style>
<Style TargetType="{x:Type Border}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin, ElementName=DetailGrid}" Value="True">
<Setter Property="BorderThickness" Value="3"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<!-- This text box is just so that the grid can get keyboard focus within -->
<TextBox Width="200" Height="20" VerticalAlignment="Center"/>
</Border>
</Grid>
</StackPanel>
И обработчик событий с выделенным кодом, который подтверждает, что свойство изменилось на ожидаемое
private void DetailGrid_OnIsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine("DetailGrid keyboard focus within = " + (bool) e.NewValue) ;
}
- "DetailGrid" содержитрамка нулевой толщины вокруг текстового поля.
- Триггер на границе привязывается к IsKeyboardFocusWithin родительского DetailGrid.
- Если пользователь щелкает текстовое поле, для свойства сетки IsKeyboardFocusWithin устанавливается значение true (я проверил это вcode-behind).
- Триггер сообщает, что когда свойство IsKeyboardFocusWithin элемента DetailGrid установлено в значение true, толщина границы должна быть увеличена до 3.
Но этого не происходит.
Я попытался изменить настройки окна вывода отладки, чтобы получить более подробные сведения о привязке WPF, но я не вижу там никаких проблем.
Я попытался изменить привязку для использования FindAncestor, но это не помоглоРазница.
Моя интуиция говорит мне, что это должно быть что-то невероятно простое и глупое, но я не вижу этого. Что мне здесь не хватает?