2009-11-12 10 views
2

J'utilise un modèle MVVM pour implémenter une application WPF. Ma question est, J'ai un Oui et Non Radio Boutons et une zone de texte.MVVM WPF Question

ex: Possédez-vous une voiture: Oui, Non (Boutons radio) Entrez Modèle: ______________ (zone de texte)

si l'utilisateur sélectionne Non, je le désactiver. Si l'utilisateur sélectionne Oui et laisse la zone de texte 'Entrer le modèle' vide, je veux afficher un message ou changer d'arrière-plan (comme le fait AdornerElement). Comment puis-je atteindre cet objectif.

Merci, Re @@ y.

Répondre

1

Ce que je ferais, si vous êtes désespéré d'utiliser MVVM, est de créer un certain nombre de convertisseurs de type personnalisé (http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx). Par conséquent, dans un bloc de texte, liez le texte à la propriété IsChecked des boutons radio puis, à l'aide du convertisseur, traduisez ce booléen en une chaîne personnalisée que vous souhaitez afficher.

Pour l'arrière-plan du formulaire, liez l'élément Background à IsChecked du contrôle approprié et utilisez un autre convertisseur de type pour convertir bool en Color.

C'est, à mon avis, comment le faire via MVVM.

+0

C'est ce que j'ai proposé ci-dessus aussi, et ce n'est pas vraiment MVVM c'est purement un travail XAML, donc pas de code C# ou ViewModel nécessaire pour faire notre solution. –

+0

Merci pour la réponse .. je vais le vérifier ... – Manohar

+0

Jobi Joy: Avez-vous un exemple de votre code? Je suis nouveau dans MVVM et j'ai besoin de beaucoup d'exemples pour apprendre. – YukiSakura

1

En fait, vous n'avez pas besoin d'appliquer MVVM pour ce problème particulier, car c'est totalement lié à l'interface utilisateur. Vous pouvez avoir la propriété IsEnabled liée à la propriété yesRadiobutton.IsChecked pour la désactiver pendant que vous sélectionnez noRasioButton. Et encore une fois, vous pouvez utiliser BoolToVisibilityConverter et lier la même chose à un TextBlock pour afficher un message. Idem pour un rectangle avec un fond particulier

+0

Pourriez-vous me donner un exemple de code? – YukiSakura

0

Je voudrais implémenter cela en utilisant seulement des déclencheurs. Pas besoin de compliquer les choses en utilisant MVVM quand vous n'en avez pas besoin.

0

Ce ne fait pas partie du modèle MVVM, utilisez un déclencheur WPF comme suit, pour la couleur de fond utiliser un converter`

<Window.Resources> 
    <conv:BackgroundConverter x:Key="backgroundConverter"/> 
    <Style TargetType="{x:Type TextBox}" x:Key="ModelBoxStyle"> 
     <Setter Property="IsEnabled" Value="True"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=NoOption,Path=IsChecked}" Value="True" > 
       <Setter Property="IsEnabled" Value="False"></Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid Background="{Binding Text,ElementName=ModelBox,Converter={StaticResource backgroundConverter}}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="10"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <RadioButton Content="Yes" x:Name="YesOption" Grid.Column="0"/> 
    <RadioButton Content="No" x:Name="NoOption" Grid.Column="2"/> 
    <TextBlock Text="Enter Model :" Grid.Row="1" Grid.Column="0"/> 
    <TextBox x:Name="ModelBox" MinWidth="100" Height="20" Grid.Row="1" Grid.Column="2" Style="{StaticResource ModelBoxStyle}" 
    HorizontalAlignment="Center" VerticalAlignment="Top"/> 
</Grid> 


public class BackgroundConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string text = value as string; 
     if (string.IsNullOrEmpty(text)) 
     { 
      return Brushes.Red; 
     } 
     return Brushes.White; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}