error - wpf combobox validate
Usando las reglas de validación de WPF y deshabilitando un botón ''Guardar'' (8)
Aquí está la muestra completa de lo que necesita.
http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/
https://skydrive.live.com/?cid=2c6600f1c1d5e3be&id=2C6600F1C1D5E3BE%21203
Tengo una página donde algunos cuadros de texto no pueden estar vacíos antes de hacer clic en un botón Guardar.
<TextBox...
<TextBox.Text>
<Binding Path ="LastName" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:StringRequiredValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
Mi regla funciona Tengo un borde rojo alrededor de mi cuadro de texto hasta que ingrese un valor. Así que ahora quiero agregar esta regla de validación a mis otros cuadros de texto.
Ahora, ¿cómo desactivo el botón Guardar hasta que la página no tenga errores? No sé qué revisar para ver si hay algún error de validación.
Aquí hay un método auxiliar que rastrea los errores de validación en los objetos de dependencia (y todos sus elementos secundarios) y las llamadas delegadas para notificar sobre el cambio. También rastrea la eliminación de los niños con errores de validación.
public static void AddErrorHandler(DependencyObject element, Action<bool> setHasValidationErrors)
{
var errors = new List<Tuple<object, ValidationError>>();
RoutedEventHandler sourceUnloaded = null;
sourceUnloaded = (sender, args) =>
{
if (sender is FrameworkElement)
((FrameworkElement) sender).Unloaded -= sourceUnloaded;
else
((FrameworkContentElement) sender).Unloaded -= sourceUnloaded;
foreach (var error in errors.Where(err => err.Item1 == sender).ToArray())
errors.Remove(error);
setHasValidationErrors(errors.Any());
};
EventHandler<ValidationErrorEventArgs> errorHandler = (_, args) =>
{
if (args.Action == ValidationErrorEventAction.Added)
{
errors.Add(new Tuple<object, ValidationError>(args.OriginalSource, args.Error));
if (args.OriginalSource is FrameworkElement)
((FrameworkElement)args.OriginalSource).Unloaded += sourceUnloaded;
else if (args.OriginalSource is FrameworkContentElement)
((FrameworkContentElement)args.OriginalSource).Unloaded += sourceUnloaded;
}
else
{
var error = errors
.FirstOrDefault(err => err.Item1 == args.OriginalSource && err.Item2 == args.Error);
if (error != null)
errors.Remove(error);
}
setHasValidationErrors(errors.Any());
};
System.Windows.Controls.Validation.AddErrorHandler(element, errorHandler);
}
Desea usar la propiedad adjunta Validation.HasError .
En la misma línea, Josh Smith tiene una lectura interesante sobre Binding to (Validation.Errors) [0] sin crear Debug Spew .
En el código detrás de la vista, puede conectar el Validation.ErrorEvent como tal;
this.AddHandler(Validation.ErrorEvent,new RoutedEventHandler(OnErrorEvent));
Y entonces
private int errorCount;
private void OnErrorEvent(object sender, RoutedEventArgs e)
{
var validationEventArgs = e as ValidationErrorEventArgs;
if (validationEventArgs == null)
throw new Exception("Unexpected event args");
switch(validationEventArgs.Action)
{
case ValidationErrorEventAction.Added:
{
errorCount++; break;
}
case ValidationErrorEventAction.Removed:
{
errorCount--; break;
}
default:
{
throw new Exception("Unknown action");
}
}
Save.IsEnabled = errorCount == 0;
}
Esto supone que se te notificará la eliminación (lo que no sucederá si eliminas el elemento infractor mientras no sea válido).
He intentado varias de las soluciones indicadas anteriormente; sin embargo, ninguno de ellos funcionó para mí.
Mi problema simple
Tengo una ventana de entrada simple que solicita un URI del usuario, si el valor de TextBox
no es un Uri
válido, entonces el botón Aceptar debería estar deshabilitado.
Mi solución simple
Esto es lo que funcionó para mí:
CommandBindings.Add(new CommandBinding(AppCommands.Okay,
(sender, args) => DialogResult = true,
(sender, args) => args.CanExecute = !(bool) _uriTextBoxControl.GetValue(Validation.HasErrorProperty)));
esto es lo que necesita para verificar la propiedad de control HasError del código behaind
y haga este código en el botón Guardar, haga clic
BindingExpression bexp = this.TextBox1.GetBindingExpression(TextBox.TextProperty);
bexp.UpdateSource(); // this to refresh the binding and see if any error exist
bool hasError = bexp.HasError; // this is boolean property indique if there is error
MessageBox.Show(hasError.ToString());
solo en su ViewModel de System.ComponentModel.IDataErrorInfo para Validate y de INotifyPropertyChanged para notificar el botón
hacer propiedad:
public bool IsValid
{
get
{
if (this.FloorPlanName.IsEmpty())
return false;
return true;
}
}
en xaml, conéctelo al botón
<Button Margin="4,0,0,0" Style="{StaticResource McVMStdButton_Ok}" Click="btnDialogOk_Click" IsEnabled="{Binding IsValid}"/>
en las anulaciones de IDataErrorInfo, notifique btutton
public string this[string columnName]{
get
{
switch (columnName)
{
case "FloorPlanName":
if (this.FloorPlanName.IsEmpty())
{
OnPropertyChanged("IsValid");
return "Floor plan name cant be empty";
}
break;
}
}
}
int count = 0;
private void LayoutRoot_BindingValidationError(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
button1.IsEnabled = false;
count++;
}
if (e.Action == ValidationErrorEventAction.Removed)
{
count--;
if (count == 0) button1.IsEnabled = true;
}
}