2009-07-07 8 views
0

Ich habe ein WinForms-Formular, das ein ElementHost-Steuerelement (das ein WPF-Benutzersteuerelement enthält) und eine Schaltfläche Speichern enthält.WPF-Validierung in einem ElementHost-Steuerelement

In der WPF UserControl habe ich ein Textfeld mit einigen Validierung darauf. Etwas wie das ...

<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> 

Das alles funktioniert gut. Was ich jedoch tun möchte, ist die Schaltfläche Speichern deaktivieren, während das Formular in einem ungültigen Zustand ist.

Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Nun, ich habe endlich eine Lösung für mein Problem gefunden.

In der WPF-Steuerung habe ich dies zum Loaded Ereignis hinzugefügt.

Validation.AddErrorHandler(this.txtSomething, ValidateControl); 

Wo ValidateControl oben, wie dies definiert ist:

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

Schließlich habe ich eine Veranstaltung namens Validated, die eine IsValid boolean in seiner Veranstaltung args enthält. Ich war dann in der Lage, dieses Ereignis auf meinem Formular anzuhängen, um ihm zu sagen, dass das Steuerelement gültig ist oder nicht.

Wenn es einen besseren Weg gibt, wäre ich interessiert zu lernen.

1

ich denke, das Ihnen helfen soll:

<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; 
} 

Dann vielleicht könnten Sie die Hauptform über eine Änderung mit einer Veranstaltung auf dem Usercontrol registriert informieren.

Verwandte Themen