为什么这个DataTrigger基于祖先附加属性更改元素的样式不起作用?

时间:2010-11-17 01:14:21

标签: c# wpf triggers styles attached-properties

所以,我有一些带有一些控件的Window。在资源部分,我已经定义了这种风格:

<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 个答案:

答案 0 :(得分:1)

您向DependencyProperty.RegisterAttached传递的名称与您在C#中为该属性提供的名称不同。因此DP系统认为它被称为CurrentSystemTheme,但您的代码认为它被称为CurrentTheme。尝试将CurrentTheme作为第一个参数传递给RegisterAttached

此外,您可能希望为数据绑定启用WPF调试日志输出(默认情况下在旧版本的WPF中启用,但在.NET 4 / VS 2010中,您需要在工具中将其打开 - &gt;调试 - >输出窗口下的选项窗口。这样,我通常设置WPF跟踪设置 - &gt; All的数据绑定选项。这样,如果数据绑定失败,您将在“输出”窗口中看到错误。这可能有助于您诊断数据触发器失败的原因。