visual validar solo numeros numericos ingresar form espacios como campos blanco c# wpf validation xaml

c# - validar - Una validación de datos de formularios WPF realmente simple. ¿Cómo?



validar espacios en blanco c# (6)

Creo que el problema podría ser que tu clase no está implementando INotifyPropertyChanged, por lo que no es vinculante como estás esperando.

Implemente la interfaz INotifyPropertyChanged, genere un evento cuando la propiedad cambió y debería funcionar.

Consulte http://msdn.microsoft.com/en-us/library/ms743695(v=vs.110).aspx para obtener un tutorial.

Soy realmente nuevo en todo este asunto de WPF, por lo que mi problema probablemente sea tonto, pero por favor desnudo conmigo ... Estoy teniendo esta clase realmente simple, vamos a llamarlo Cliente. Se ve así:

namespace TestValidation { class Customer { private string _name; public string Name { get { return _name; } set { _name = value; if (String.IsNullOrEmpty(value)) { throw new Exception("Customer name is mandatory."); } } } } }

Ahora, he creado un formulario básico, donde el usuario puede agregar clientes a la base de datos. El formulario contiene un simple TextBox, delimitado a la propiedad Nombre del Cliente, y un botón "Agregar".

El código XAML es:

<Window x:Class="TestValidation.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TestValidation" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBox Margin="119,86,107,194" Name="CustomerName" Text="{Binding Path=Customer.Name, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" /> <Button Content="Add" HorizontalAlignment="Left" Margin="204,176,0,0" VerticalAlignment="Top" Width="74"/> </Grid> </Window>

Desde el setter de la propiedad Name, puede comprender que el nombre es obligatorio para mí, por lo que quiero que un evento de validación aumente si el Name TextBox se deja en blanco. Según las reglas de validación de WPF, una vez que el usuario se enfoca en el cuadro de texto y no tiene ningún valor, debe cambiar el color del borde a rojo. Por alguna razón, esto no está sucediendo, y no tengo ni idea de por qué. ¿Qué está mal en mi proceso?

Ahora, he leído muchos buenos artículos sobre Validación en WPF (como Enforcing Complex Business Data Rules with WPF , Validación de datos en WPF y Validación en Windows Presentation Foundation), pero ninguno de ellos me ayudó a resolver mi problema.

Eventualmente, quiero que el formulario se vea como el formulario en el excelente artículo de Brian Noyes sobre el primer enlace (No tengo 10 créditos, así que no puedo adjuntar una foto ... lo siento).

Estaré agradecido si alguien me puede explicar cómo funciona realmente.

Nota importante: estoy trabajando con .Net framework 4, por lo que necesito una solución que se adapte a esta versión.


No especificó una regla de validación. La regla de validación se invocará antes de que se deje el control y luego podrá hacer lo que quiera para validar las entradas.

Un ejemplo simple - y supongo que eso es lo que quieres hacer - se proporciona aquí .



Definitivamente recomendaría usar IDataErrorInfo para la validación de WPF ya que WPF ya entiende cómo usarlo, y es fácil de implementar.

Para comenzar, agregue la interfaz a la clase que contiene los datos que desea validar. Los métodos requeridos probablemente se verán así:

public class Customer : IDataErrorInfo { ... #region IDataErrorInfo Members string IDataErrorInfo.Error { get { return null; } } string IDataErrorInfo.this[string columnName] { get { if (columnName == "Name") { // Validate property and return a string if there is an error if (string.IsNullOrEmpty(Name)) return "Name is Required"; } // If there''s no error, null gets returned return null; } } #endregion }

A continuación, debe establecer ValidatesOnDataErrors=True en su enlace TextBox para que ejecute la validación cada vez que cambie la propiedad Name :

<TextBox Text="{Binding Path=Customer.Name, ValidatesOnDataErrors=True}" ... />

Y finalmente, cree una Plantilla de validación en su XAML para decirle a WPF cómo dibujar un error de validación. Aquí está el estilo / plantilla que suelo usar:

<!-- ValidatingControl Style --> <Style TargetType="{x:Type FrameworkElement}" x:Key="ValidatingControl"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" /> </Trigger> </Style.Triggers> </Style>

Además, asegúrese de que su clase Customer implemente INotifyPropertyChanged para que responda correctamente a las actualizaciones de UI. No veo eso en tu código, pero a menudo la gente lo deja por simplicidad :)



<ControlTemplate x:Key="TextBoxErrorTemplate"> <StackPanel> <StackPanel Orientation="Horizontal"> <Image Height="16" Margin="0,0,5,0" Source="Assets/warning_48.png"/> <AdornedElementPlaceholder x:Name="Holder"/> </StackPanel> <Label Foreground="Red" Content="{Binding ElementName=Holder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/> </StackPanel> </ControlTemplate> <TextBox x:Name="Box" Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"> <TextBox.Text> <Binding Path="ValueInBox" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <ValidationExpamples:DoubleRangeRule Min="0.5" Max="10"/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> public class IntRangeRule : ValidationRule { private int _min; private int _max; public IntRangeRule() { } public int Min { get { return _min; } set { _min = value; } } public int Max { get { return _max; } set { _max = value; } } public override ValidationResult Validate(object value, CultureInfo cultureInfo) { int l_input = 0; try { if (((string)value).Length > 0) { l_input = Int32.Parse((String)value); } } catch (Exception e) { return new ValidationResult(false, "Illegal characters or " + e.Message); } if ((l_input < Min) || (l_input > Max)) { return new ValidationResult(false, "Please enter an value in the range: " + Min + " - " + Max + "."); } return new ValidationResult(true, null); } }