Привязка к свойству родительской Grid панели WPF завершается неудачно, но не выдает предупреждающих сообщений о привязке - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь что-то, что мне показалось довольно простым. Я хочу, чтобы граница в моей сетке появлялась всякий раз, когда фокус клавиатуры находится внутри сетки.

Но привязка не работает, и я не могу определить, что с ней не так. Я надеюсь, что кто-то может определить, где я ошибся.

Я создал простое тестовое приложение, чтобы проиллюстрировать проблему. Вот содержимое окна

<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, но это не помоглоРазница.

Моя интуиция говорит мне, что это должно быть что-то невероятно простое и глупое, но я не вижу этого. Что мне здесь не хватает?

1 Ответ

2 голосов
/ 06 ноября 2019

Вместо этого вы должны изменить Border в XAML на следующее:

<Border BorderBrush="Black" >
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Setter Property="BorderThickness" Value="0"></Setter>
            <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>

Я удалил разметку BorderThickness="0" из определения Border, поскольку она имеет более высокий приоритет чем значение, установленное через Style Setter, поэтому ваш Setter не может переопределить его. Я переместил это значение по умолчанию в значение по умолчанию Style Setter, как вы можете видеть.

Я также изменил значение BorderBrush на Black, чтобы вы могли видеть, что оно становится видимым.

...