2011-03-02 4 views
1

J'ai une zone de texte à l'intérieur de usercontrol qui implémente ValidationRule et ça fonctionne bien, maintenant dans la fenêtre où j'utilise ce contrôle a un bouton, et je veux que ce bouton soit désactivé si la zone de texte à l'intérieur de usercontrol n'est pas valideComment vérifier si UserControl est valide ou non

Répondre

0

L'astuce consiste ici à utiliser une commande au lieu de l'événement click. Une commande contient une logique pour déterminer si la commande est valide, ainsi que le code réel à exécuter lorsque la commande est exécutée.

Nous créons une commande et lions le bouton. Le bouton sera automatiquement désactivé si Command.CanExecute() renvoie false. Il y a beaucoup d'avantages à utiliser le cadre de commande, mais je ne vais pas en parler ici.

Voici un exemple qui devrait vous aider à démarrer. Le XAML:

<StackPanel> 
    <Button Content="OK" Command="{Binding Path=Cmd}"> 
    </Button> 
    <TextBox Name="textBox1"> 
     <TextBox.Text> 
      <Binding Path="MyVal" UpdateSourceTrigger="PropertyChanged" > 
       <Binding.ValidationRules> 
        <local:MyValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
</StackPanel> 

Le UserControl code-behind (ce qui est probablement similaire à ce que vous avez déjà, mais je l'ai inclus pour montrer comment la commande est créée):

public partial class UserControl1 : UserControl 
{ 
    private MyButtonCommand _cmd; 
    public MyButtonCommand Cmd 
    { 
     get { return _cmd; } 
    } 

    private string _myVal; 
    public string MyVal 
    { 
     get { return _myVal; } 
     set { _myVal = value; } 
    } 

    public UserControl1() 
    { 
     InitializeComponent(); 
     _cmd = new MyButtonCommand(this); 
     this.DataContext = this; 
    } 
} 

Le Classe de commande. Le but de cette classe est de décider si la commande est valide à l'aide du système de validation et de rafraîchir son état lorsque le TextBox.Text change:

public class MyButtonCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     if (Validation.GetHasError(myUserControl.textBox1)) 
      return false; 
     else 
      return true; 
    } 

    public event EventHandler CanExecuteChanged; 
    private UserControl1 myUserControl; 

    public MyButtonCommand(UserControl1 myUserControl) 
    { 
     this.myUserControl = myUserControl; 
     myUserControl.textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged); 
    } 

    void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (CanExecuteChanged != null) 
      CanExecuteChanged(this, EventArgs.Empty); 
    } 

    public void Execute(object parameter) 
    { 
     MessageBox.Show("hello"); 
    } 
} 
+0

Merci pour votre réponse, mais en fait je ne pas besoin bouton à l'intérieur usercontrol, de toute façon j'ai trouvé une solution, j'ai ajouté une propriété dans mon usercontrol 'IsValid', et je l'ai mis à Validation.Error Event, et j'ai utilisé cette propriété dans l'événement CanExecute de bouton à la fenêtre hébergée. Donc ça fonctionne bien. – Ali

Questions connexes