2010-11-01 27 views
4

Je travaille sur un jeu de société pour maîtriser WPF et je suis coincé après avoir essayé toute la nuit pour que cette partie fonctionne.WPF DataTrigger

Le code suivant appartient au contrôle utilisateur 'House' et fonctionne très bien sur le concepteur. Je peux sélectionner l'objet 'house' et modifier la propriété HouseType sur la grille de propriété et voir l'effet désiré. Mais en runtime, si je change la même propriété, rien ne se passe!

<DrawingBrush x:Key="emptyHouseBrush"> 
    <DrawingBrush.Drawing> 
    <GeometryDrawing Geometry="M0,0 100,100 M0,100 100,0"> 
     <GeometryDrawing.Pen> 
     <Pen Brush="Black" /> 
     </GeometryDrawing.Pen> 
    </GeometryDrawing> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

<DataTemplate DataType="{x:Type m:House}"> 
    <Border x:Name="border" BorderThickness="2" > 
    <Grid x:Name="grid" > 

    </Grid> 
    </Border>  
    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Neutral"> 
     <Setter TargetName="border" Property="BorderBrush" Value="Black"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Forbidden"> 
     <Setter TargetName="border" Property="BorderBrush" Value="Black"/> 
     <Setter TargetName="grid" Property="Background" Value="{StaticResource ResourceKey=emptyHouseBrush}"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Borders"> 
     <Setter TargetName="border" Property="BorderBrush" Value="#FF7A6D34"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=HouseType}" Value="Homeland"> 
     <Setter TargetName="border" Property="BorderBrush" Value="#FFFFD200"/> 
     <Setter TargetName="border" Property="Background" Value="#54FBE681"/> 
    </DataTrigger> 

    <Trigger SourceName="border" Property="IsMouseOver" Value="True"> 
     <Setter TargetName="border" Property="Background" Value="#645CAEF9"/> 
    </Trigger> 

    </DataTemplate.Triggers> 
</DataTemplate> 


</Control.Resources> 
    <ContentControl> 
    <m:House x:Name="house" HouseType="Neutral"></m:House> 
    </ContentControl> 

</UserControl> 

J'ai essayé d'utiliser les propriétés par défaut, les propriétés de dépendance, implémentant l'interface IPropertyChanged, essayé de déplacer la propriété au contrôle et à la répétition de ce qui précède ... et toujours rien.

Qu'est-ce qui me manque? Comment puis-je mettre le contrôle à jour la bordure (et l'arrière-plan) une fois que j'ai changé cette propriété?

Merci d'avance.

Marcelo

Répondre

0

Cela me semble bon. Assurez-vous que l'objet House est implémentant INotifyPropertyChanged et que vous appelez PropertyChanged lors de la mise à jour de la propriété. Si cela ne fonctionne toujours pas, regardez votre fenêtre de débogage de sortie. Les erreurs de liaison apparaissent généralement là-bas.

1

Son semble que vous confondez ControlTemplates avec DataTemplates. Un DataTemplate est utilisé pour spécifier comment un certain type d'objet de données doit être affiché. Il contient généralement quelques contrôles liés aux propriétés de l'objet. Ce que vous voulez, c'est modifier la visualisation par défaut d'un contrôle, c'est mieux fait en utilisant un ControlTemplate. Si vous souhaitez conserver la visualisation du contrôle et ajouter simplement le changement de couleur de la bordure, vous pouvez utiliser un outil tel que Blend pour obtenir le ControlTemplate actuel du contrôle House et le personnaliser en ajoutant vos triggers