2010-06-08 2 views
3

J'ai une classe appelée Question qui représente une question et sa réponse. J'ai une application qui rend un ObservableCollection de Question objets. Chaque Question est rendu comme un StackPanel qui contient un TextBlock pour le verbiage de question, et un TextBox pour l'utilisateur à entrer dans une réponse. Les questions sont rendues à l'aide d'un ItemsControl, et j'ai initialement défini le style de StackPanel des questions en utilisant une clé StaticResource appelée 'IncorrectQuestion' (définie dans la section UserControl.Resources de la page). Dans la section UserControl.Resources, j'ai également défini une clé calld 'CorrectQuestion' dont j'ai besoin pour m'appliquer en quelque sorte au StackPanel de la Question lorsque l'utilisateur répond correctement à la question. Mon problème est que je ne suis pas sûr de changer dynamiquement le style du StackPanel, en particulier dans les contraintes d'une classe ViewModel (c'est-à-dire que je ne veux pas mettre de code de sélection de style dans le code-behind de View). Ma classe Question a une propriété IsCorrect qui est définie avec précision lorsque la correction est prise. Je voudrais en quelque sorte refléter la valeur IsCorrect sous la forme d'une sélection de style. Comment je fais ça?Silverlight ~ MVVM ~ Paramètre dynamique de la propriété Style basé sur la valeur du modèle

Répondre

3

L'utilisation d'un convertisseur de valeur est une solution.

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.Resources> 
     <local:BoolToStyleConverter x:Key="Correctness"> 
      <local:BoolToStyleConverter.FalseValue> 
       <Style TargetType="TextBox"> 
        <Setter Property="Background" Value="Salmon" /> 
       </Style> 
      </local:BoolToStyleConverter.FalseValue> 
      <local:BoolToStyleConverter.TrueValue> 
       <Style TargetType="TextBox"> 
        <Setter Property="Background" Value="AliceBlue" /> 
       </Style> 
      </local:BoolToStyleConverter.TrueValue> 
     </local:BoolToStyleConverter> 
    </Grid.Resources> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Question}" /> 
        <TextBox x:Name="Answer" Text="{Binding Answer, Mode=TwoWay}" 
         Style="{Binding IsCorrect, Converter={StaticResource Correctness}}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl>   
</Grid> 

Vous pouvez trouver la base du BoolToStyleConverter est basé sur ce blog post. Créé comme: -

public class BoolToStyleConverter : BoolToValueConverter<Style> { } 
+0

J'ai essayé d'utiliser un convertisseur de valeur, mais je n'arrive pas à le faire fonctionner. Je pense que je faisais juste quelque chose de mal. Je vais revoir cette option. À votre santé! – eponymous23

Questions connexes