nur um anzuzeigen, wie ich diese IDataErrorInfo
Verwendung behandelt ...
ich einen Anruf auf ein neues Verfahren OnDataUpdated()
in jedem Setter meiner Ansicht gebundene Eigenschaft, wie genannt gestellt:
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();
}
}
dann innerhalb OnDataUpdated()
Zeichen ein privates Feld boolean als true
Daten, die zum ersten Mal geändert (FormType
wurde nur notwendig für mein Business Case):
private void OnDataUpdated()
{
dataChanged = true;
// .. Any other universal RaisePropertyChanged() events you may want to call to get your UI into sync. Eg. RaisePropertyChanged(() => CanConfirm);
}
Dann in meiner IDataErrorInfo
Indexer-Eigenschaft mache ich Folgendes (Ich habe es aufgeteilt, so 'ValidForm()' kann manuell aufgerufen werden, um auch Formular-Validierung durchzuführen.
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;
}
Funktioniert wunderbar. Jetzt habe ich nur noch Validierungsstile, nachdem ein Benutzer das Formular bearbeitet hat.
Wenn Sie einige zusätzliche Sahnehäubchen auf dem Kuchen wollen, können Sie in meinem RaisePropertyChanged(() => CanConfirm);
im OnDataUpdated()
Verfahren Stellung zu nehmen und binden, die zu Ihrem bestätigen Knopf IsEnabled={Binding CanConfirm}
mit der zugehörigen Eigenschaft:
/// <summary>
/// Can the user confirm step 1?
/// </summary>
public bool CanConfirm
{
get { return ValidForm(FormType.Step1); }
}
und Ihre Schaltfläche wird nur sein aktiviert, wenn Ihr Formular auch gültig ist. :)
Viel Spaß! und viel Glück mit dem Ungetüm, das WPF ist.
Haben Sie den besten Ansatz für diesen Brian ausgearbeitet? : \ – GONeale