2010-11-22 7 views
1

J'ai une zone de liste qui a des modèles définis pour les styles ItemContainer et ItemTemplate.TemplateBinding et ContentPresenter dans Silverlight/WPF

Mon ItemTemplate est un DataTemplate qui est très simple:

<DataTemplate x:Key="DataTemplate1"> 
    <Grid x:Name="grid"> 
    <TextBlock TextWrapping="Wrap" Text="{Binding}" Foreground="White" FontSize="24" />  
    </Grid> 
</DataTemplate> 

et ItemContainer est également très simple:

<Grid x:Name="Grid" HorizontalAlignment="Stretch" Height="Auto" SnapsToDevicePixels="true" Width="373" Background="{x:Null}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="37"/> 
    </Grid.ColumnDefinitions> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="SelectionStates"> 
      <VisualState x:Name="Unselected"/> 
      <VisualState x:Name="Selected"/> 
      <VisualState x:Name="SelectedUnfocused"/> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <ContentPresenter x:Name="contentPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Stretch" Margin="2,0,0,0" d:LayoutOverrides="Width"> 
    </ContentPresenter> 
    <Image x:Name="image" HorizontalAlignment="Center" Margin="0,0,0,1" Source="/MyApp;component/Images/icon_arrowcircle.png" Stretch="Uniform" Width="37" Grid.Column="1" VerticalAlignment="Center" Opacity="0"/> 
</Grid> 

qui tout fonctionne très bien. Mais ce que je veux pouvoir faire est, quand un élément est sélectionné (ie l'état visuel sélectionné) je veux que le TextBlock dans le DataTemplate change sa couleur de premier plan en noir au lieu de blanc et augmente la taille de la police . Mais je n'arrive pas à trouver une manière propre de le faire car TemplateBinding ne semble pas être disponible à partir d'un DataTemplate.

Des idées?

Répondre

2

Si vous souhaitez que le modèle de ItemContainer contrôle le Foreground, vous pouvez le définir ici à la place de ItemTemplate. TextBlock.Foreground et TextBlock.FontSize peuvent être utilisés comme propriétés attachées et hériteront d'une valeur mère:

<ContentPresenter TextBlock.Foreground="White" TextBlock.FontSize="18"/> 

Les paramètres de ces propriétés devront être retirés du ItemTemplate pour éviter les valeurs héritées impérieuses. Vous pouvez ensuite définir les valeurs dont vous avez besoin à partir des animations VisualState.

+0

Je ne pense pas que cela fonctionne dans Silverlight cependant. – AnthonyWJones

+0

Ça marche! Merci beaucoup John, mais en tant qu'extension, comment puis-je déclencher le changement de ces valeurs dans différents états visuels? – Mark

+0

En fait, vous pouvez :) Je viens de trouver ce blog par Charles http://www.charlespetzold.com/blog/2007/09/080231.html – Mark

0

Ne pensez pas que la réponse fonctionne plus dans les versions actuelles de Silverlight, les orpoerties attachées sur le ContentPresenter ne construisent même plus. Quelqu'un d'autre comprend cela?