Почему этот DataTrigger для изменения стиля элемента, основанного на присоединенном свойстве предка, не работает? - PullRequest
0 голосов
/ 17 ноября 2010

Итак, у меня есть это окно с некоторыми элементами управления. В разделе ресурсов я определил этот стиль:

<Style x:Key="StyleNavBar" TargetType="{x:Type Grid}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding CurrentTheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
            <DataTrigger.Value>
                <theme:WinTheme>WindowsClassic</theme:WinTheme>
            </DataTrigger.Value>
            <Setter Property="Background" Value="#FFFFFFFF" />
        </DataTrigger>
    </Style.Triggers>
</Style>

В моем окне я определяю прикрепленное свойство с именем «CurrentTheme», в котором хранится (на основе перечисления) текущая тема, используемая для всей системы. Вот код:

public static readonly DependencyProperty CurrentSystemThemeProperty =
    DependencyProperty.RegisterAttached(
        "CurrentSystemTheme",
        typeof(WinTheme),
        typeof(MainWindow),
        new UIPropertyMetadata(WinTheme.AeroGlass));

public WinTheme CurrentTheme
{
    get
    {
        return (WinTheme)GetValue(CurrentSystemThemeProperty);
    }
    set
    {
        SetValue(CurrentSystemThemeProperty, value);
    }
}

Каждый раз, когда пользователь меняет системную тему, мое окно получает обратный вызов через WndProc, сообщая, что тема изменилась. И, как вы можете видеть, значением свойства CurrentTheme по умолчанию является WinTheme.AeroGlass. Тогда у меня есть сетка в стиле, определенном выше:

<Grid Height="34" Name="grdNavBar" VerticalAlignment="Top" Style="{DynamicResource StyleNavBar}">

Моя цель состоит в том, чтобы изменить стиль на основе значения CurrentTheme, но определенный выше триггер не работает при изменении темы (он работает только со значением по умолчанию CurrentTheme, т. Е. Не реагирует на изменения в свойство).

Есть идеи, как этого добиться?

1 Ответ

1 голос
/ 17 ноября 2010

Вы передали DependencyProperty.RegisterAttached имя, отличное от имени, которое вы дали свойству в C #.Таким образом, система DP думает, что она называется CurrentSystemTheme, но ваш код думает, что она называется CurrentTheme.Попробуйте передать CurrentTheme в качестве первого аргумента RegisterAttached.

Также вы можете включить вывод журнала отладки WPF для привязки данных (который включен по умолчанию в более старых версиях WPF, но в .NET4 / VS 2010, вам нужно перейти и включить его в окне «Сервис-> Параметры» в «Отладка-> Окно вывода»).Таким образом, я обычно устанавливаю для параметра Настройки трассировки WPF -> Привязка данных значение Все.Таким образом, если привязка данных не удастся, вы увидите ошибку в окне вывода.Это может помочь вам определить причину сбоя триггера данных.

...