Ich bin im Moment ein wenig verwirrt, weil ich mich nicht sicher bin über Dinge wie "Wer ist verantwortlich für die Validierung von Modelldaten".MVVM - Wer ist verantwortlich für
ihm ein Beispiel geben:
Ich habe einen Antrag bekommen, in dem eine Beziehung zwischen einer Person und bestimmten Geräten sichtbar gemacht wird.
public class Person{
public string Firstname {get; set;}
public string Lastname {get; set;}
public SomeSortOfDevice SomeSortOfDevice {get; set;}
}
public class SomeSortOfDevice{
public DateTime DeviceExpiration {get; set;}
public string DeviceSerialCode {get; set;}
//public bool IsSerialCodeValid{get{
// SomeValidationLogic()
//}
}
In der Ansicht der App kann der Benutzer die Daten des Geräts ändern. Jetzt gibt es einige Regeln - zum Beispiel ist der DeviceExpiration an eine TextBox gebunden, sollte aber nur aktiviert werden, wenn ein gültiger SerialCode gesetzt ist.
Aber wer entscheidet, ob der SerialCode gültig ist? Das Modell selbst? Das ViewModel? Sollte das Modell eine zusätzliche Eigenschaft "IsSerialValid" enthalten oder wie könnte die IsEnabled-Eigenschaft einer TextBox an diese Regel gebunden sein?
bearbeiten 1
public class ViewModel{
public Person SelectedPerson {get; set;}
}
Das ist, wie ich die Modelle oben benutzen würde - The View wird einige Bindungen auf dem SeletedPerson bekommen.
Edit 2
ich denke, es Ein bisschen mehr complicaten ist, als ich es vorher erklärt. Nehmen wir an, das Gerät ist ein Token und ich möchte feststellen, ob der Benutzer etwas eingegeben hat - wenn er etwas eingegeben hat, ist es gültig?
Wenn die Validierung sollte in Modell behandelt werden (wie ich es im Moment haben) das Modell würde wie folgt aussehen:
public Token{
public DateTime ExpirationDate {get; set;}
public string Serial {get; set;}
public bool IsTokenExpired{
get{
return ExpirationDate.Date < DateTime.Now;
}
}
public bool IsTokenValid{
get{
return new Regex("[0-9]{8,12}").Match().Success;
}
}
public bool IsTokenSet{
get{
return TokenSerial.Length > 0;
}
}
}
nun die TextBox zu aktivieren, wo der Benutzer eingeben soll (oder wählen Sie) ein Datum, die Bindung sieht wie folgt aus:
<TextBox IsEnabled="{Binding SelectedPerson.Token.IsTokenValid}"/>
das funktioniert ganz gut, aber ich habe im Modell ein gutes Gefühl über die Validierungsregeln nicht wirklich bekam.
Das 'ViewModel' sollte die Validierungen verarbeiten – bit
Können Sie uns den Befehl zeigen, den Sie ausführen möchten, wenn die Validierungen bestanden werden? – bit
Schauen Sie in IDataErrorInfo, WPF-Steuerelemente unterstützen es. –