2017-10-22 2 views
1

ich diese Vorlage für ein Item habe:Wie kann ich überprüfen, ob alle Textfelder innerhalb Items gültig sind

<DataTemplate DataType="{x:Type models:StringParameter}"> 
     <TextBox materialDesign:HintAssist.Hint="{Binding Name}"> 
      <TextBox.Text> 
       <Binding Path="Value"> 
        <Binding.ValidationRules> 
         <ınteractiveCode:NotEmptyValidationRule ValidatesOnTargetUpdated="True"></ınteractiveCode:NotEmptyValidationRule> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
    </DataTemplate> 

Und ich habe eine Schaltfläche, die mit einem Befehl funktioniert, möchte ich es aktiviert werden, wenn alle Validierungen sind in ItemsControl erfüllt. Aber ich kann keine Möglichkeit finden, Textboxen zu erreichen, die innerhalb von Datenvorlagen liegen.

Antwort

1

Ich habe einen einfachen Ansatz, um dieses spezifische Problem zu lösen. Ich habe eine ValidationChecker Klasse erstellt, die mit der Methode IsValid auf das Vorhandensein von Validierungsfehlern prüft.

public class ValidationChecker : Freezable 
{ 
    public static List<DependencyObject> elements = new List<DependencyObject>(); 

    public static int GetValidationObject(DependencyObject obj) 
    { 
     return (int)obj.GetValue(ValidationObjectProperty); 
    } 

    public static void SetValidationObject(DependencyObject obj, int value) 
    { 
     obj.SetValue(ValidationObjectProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for ErrorCount. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ValidationObjectProperty = 
     DependencyProperty.RegisterAttached("ValidationObject", typeof(DependencyObject), typeof(ValidationChecker), new PropertyMetadata(null, OnValueChanged)); 


    public static bool IsValid() 
    { 
     foreach (var item in elements) 
     { 
      if (Validation.GetHasError(item)) return false; 
     } 
     return true; 
    } 

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     elements.Add(d); 
    } 

    protected override Freezable CreateInstanceCore() 
    { 
     return new ValidationChecker(); 
    } 
} 

ValidationObject angebracht Eigenschaft kann als wie unten

<DataTemplate> 
    <TextBox local:ValidationChecker.ValidationObject="{Binding RelativeSource={RelativeSource Self}}"> 
     <TextBox.Text> 
      <Binding Path="Value"> 
       <Binding.ValidationRules> 
         <local:NotEmptyValidationRule ValidatesOnTargetUpdated="True"></local:NotEmptyValidationRule> 
       </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
</DataTemplate> 

Sie haben bereits erwähnt, implementiert werden, dass Ihre Button Bindung an einen Command war. Also implementieren Sie CanExecute Methode für die Command und rufen Sie ValidationChecker.Isvalid(). Vergessen Sie nicht, RaiseCanExecute Methode für diese Command wann immer Sie benötigen, aufzurufen.

+0

Es scheint wie ein guter Ansatz, aber wird das funktionieren, wenn Textfeld entfernt wird? –

+0

Ich habe es getestet, es ist ziemlich genau das, was ich will, danke. Aber es funktioniert nicht, wenn Textfelder entfernt werden, wie gehen wir damit um? EDIT: Ich habe das Entladen-Ereignis der Textbox behandelt, um sich selbst aus der Liste zu entfernen. Das ist jetzt die richtige Antwort. –

Verwandte Themen