Sólo para indicar cómo he manejado esta utilización IDataErrorInfo
...
pongo una llamada a un nuevo método llamado OnDataUpdated()
en cada colocador de mi propiedad vista de ruedas, tales como:
private string username;
public string Username
{
get { return username; }
set
{
username = value;
OnDataUpdated();
}
}
private string password;
public string Password
{
get { return password; }
set
{
password = value;
OnDataUpdated();
}
}
a continuación, en el interior OnDataUpdated()
marca un booleano ámbito privado como true
indicando los datos ha cambiado por primera vez (FormType
sólo era necesario para mi modelo de negocio):
private void OnDataUpdated()
{
dataChanged = true;
// .. Any other universal RaisePropertyChanged() events you may want to call to get your UI into sync. Eg. RaisePropertyChanged(() => CanConfirm);
}
Luego en mi propiedad del indexador IDataErrorInfo
hago lo siguiente (lo divido para que 'ValidForm()' se pueda llamar manualmente para realizar la validación del formulario también.
public string this[string columnName]
{
get
{
string result = null;
if (columnName == "Username")
{
// If other payment amounts have fully paid for balance, and cash amount has been entered, deny
if (!ValidForm(FormType.Step1, columnName))
result = "Please enter the username field.";
}
else if (columnName == "Password")
{
if (!ValidForm(FormType.Step1, columnName))
result = "Please enter the password field.";
}
return result;
}
}
/// <summary>
/// Test if valid form.
/// </summary>
/// <param name="formType">Specify which form we should validate.</param>
/// <param name="columnName">If ommitted, entire form will be validated.</param>
/// <returns></returns>
private bool ValidForm(FormType formType, string columnName = null)
{
// This field is used to denote when data has changed on the form.
// If data has changed, we know we can activate any form validation.
// We do not activate the form validation until after a user has typed
// something in at least.
if (!dataChanged) return true;
var errors = false;
if (formType == FormType.Step1 && ((string.IsNullOrEmpty(columnName) || columnName == "Username") && string.IsNullOrEmpty(Username)))
errors = true;
if (formType == FormType.Step1 && ((string.IsNullOrEmpty(columnName) || columnName == "Password") && string.IsNullOrEmpty(Password)))
errors = true;
return !errors;
}
Funciona beautifully. Ahora solo tengo estilos de validación que aparecen después de que un usuario edita el formulario.
Si quieres algo de la formación de hielo extra en el pastel, se puede comentar en mi RaisePropertyChanged(() => CanConfirm);
en el método OnDataUpdated()
y unir eso a su Confirmar Botón IsEnabled={Binding CanConfirm}
con la propiedad asociada:
/// <summary>
/// Can the user confirm step 1?
/// </summary>
public bool CanConfirm
{
get { return ValidForm(FormType.Step1); }
}
y el botón sólo estará habilitado cuando su formulario también es válido. :)
¡Disfrútalo! y la mejor de las suertes con el gigante que es WPF.
¿Has encontrado el mejor enfoque para este Brian? : \ – GONeale