2010-11-17 18 views
0

Donc, j'ai cette fenêtre avec quelques contrôles. Dans la section des ressources que j'ai défini ce style:Pourquoi ce DataTrigger de modifier le style d'élément basé sur la propriété attachée ancêtre ne fonctionne pas?

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

Dans ma fenêtre, je définir une propriété attachée nommé « CurrentTheme » qui stocke (basé sur un ENUM) le thème actuel utilisé l'échelle du système. Voici le code:

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); 
    } 
} 

Chaque fois que l'utilisateur change le thème du système, ma fenêtre reçoit un rappel via WndProc, informant que le thème a changé. Et, comme vous pouvez le voir, la valeur par défaut de la propriété CurrentTheme est WinTheme.AeroGlass. Ensuite, j'ai une grille de style avec le style défini ci-dessus:

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

Mon but est de changer le style en fonction de la valeur de CurrentTheme, mais le déclencheur défini ci-dessus ne fonctionne pas lorsque les changements de thème (cela fonctionne uniquement avec la valeur par défaut de CurrentTheme, c'est-à-dire, ne réagit pas aux changements dans la propriété).

Des idées sur la façon d'accomplir cela?

Répondre

1

Vous avez transmis un nom différent à DependencyProperty.RegisterAttached au nom que vous avez donné à la propriété en C#. Donc, le système DP pense qu'il s'appelle CurrentSystemTheme, mais votre code pense qu'il s'appelle CurrentTheme. Essayez de passer CurrentTheme comme premier argument à RegisterAttached. Vous pouvez également activer la sortie du journal de débogage WPF pour la liaison de données (qui est activée par défaut dans les anciennes versions de WPF, mais dans .NET 4/VS 2010, vous devez activer et activer dans les outils -> Fenêtre Options sous Débogage-> Fenêtre de sortie). De cette façon, je règle généralement l'option WPF Trace Settings -> Data Binding à All. De cette façon, si une liaison de données échoue, vous verrez une erreur dans la fenêtre Sortie. Cela peut vous aider à diagnostiquer pourquoi le déclenchement de données échoue.

+0

Merci, Ian. Quelle erreur stupide :). Cela a fonctionné maintenant. Et merci pour le conseil. – EdMelo