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.
Es scheint wie ein guter Ansatz, aber wird das funktionieren, wenn Textfeld entfernt wird? –
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. –