2010-11-17 27 views
0

所以,我有一些控件的窗口。在资源部分,我定义这个风格:为什么这个DataTrigger改变基于祖先附属属性的元素样式不起作用?

<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> 

在我的窗口,我定义了一个名为哪些商店(基于ENUM)当前主题使用的系统范围内的“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

您已通过与您在C#中给出该属性的名称不同的名称DependencyProperty.RegisterAttached。所以DP系统认为它叫做CurrentSystemTheme,但你的代码认为它叫做CurrentTheme。尝试传递CurrentTheme作为RegisterAttached的第一个参数。另外,您可能希望启用WPF调试日志输出以进行数据绑定(默认情况下,在较早版本的WPF中,但在.NET 4/VS 2010中,您需要在Tools中将其打开 - >调试 - >输出窗口下的选项窗口)。这样,我通常将WPF跟踪设置 - >数据绑定选项设置为全部。这样,如果数据绑定失败,您将在“输出”窗口中看到错误。这可能有助于您诊断数据触发器失败的原因。

+0

谢谢,伊恩。多么愚蠢的错误:)。它现在有效。并感谢提示。 – EdMelo 2010-11-17 01:22:44

相关问题