2009-07-07 6 views
0

J'ai un formulaire WinForms qui contient un contrôle ElementHost (qui contient un WPF UserControl) et un bouton Enregistrer.Validation WPF dans un contrôle ElementHost

Dans WPF UserControl, j'ai une zone de texte avec une validation. Quelque chose comme ça ...

<TextBox Name="txtSomething" ToolTip="{Binding ElementName=txtSomething, Path=(Validation.Errors).[0].ErrorContent}"> 
    <Binding NotifyOnValidationError="True" Path="Something"> 
     <Binding.ValidationRules> 
      <commonWPF:DecimalRangeRule Max="1" Min="0" /> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox> 

Tout cela fonctionne très bien. Ce que je veux cependant faire, c'est désactiver le bouton Enregistrer lorsque le formulaire est dans un état invalide.

Toute aide serait grandement appréciée.

Répondre

0

Eh bien, j'ai enfin trouvé une solution à mon problème.

Dans le contrôle WPF, j'ai ajouté cela à l'événement Loaded.

Validation.AddErrorHandler(this.txtSomething, ValidateControl); 

ValidateControl ci-dessus, est défini comme suit:

private void ValidateControl(object sender, ValidationErrorEventArgs args) 
{ 
    if (args.Action == ValidationErrorEventAction.Added) 
     OnValidated(false); 
    else 
     OnValidated(true); 
} 

Enfin j'ai ajouté un événement appelé Validated qui contient un IsValid booléenne dans ses args événement. J'ai alors pu relier cet événement sur mon formulaire pour lui dire que le contrôle est valide ou non.

S'il y a un meilleur moyen que je serais intéressé à apprendre.

1

Je pense que cela devrait vous aider:

<UserControl Validation.Error="Validation_OnError > 
<UserControl.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Save" CanExecute="OnCanExecute" Executed="OnExecute"/> 
</UserControl.CommandBindings> 
... 
<Button Command="ApplicationCommands.Save" /> 
... 
</UserControl> 

/* put this in usercontrol's code behind */ 
int _errorCount = 0; 
private void Validation_OnError(object sender, ValidationErrorEventArgs e) 
{ 
    switch (e.Action) 
    { 
     case ValidationErrorEventAction.Added: 
      { _errorCount++; break; } 
     case ValidationErrorEventAction.Removed: 
      { _errorCount--; break; } 
    } 
} 

private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = _errorCount == 0; 
} 

peut-être alors vous pourriez informer le mainform un changement avec un événement enregistré sur le usercontrol.