ViewModel:
%Vor%XAML:
%Vor%Gibt es eine Möglichkeit zu vermeiden, MaxLength der TextBox zu setzen, um mein ViewModel (das könnte sich ändern, da es in einer anderen Assembly ist) und automatisch die maximale Länge basierend auf der Anforderung StringLength festlegen?
Ich habe ein Verhalten verwendet, um die TextBox zu verbinden das Validierungsattribut seiner gebundenen Eigenschaft (falls vorhanden). Das Verhalten sieht folgendermaßen aus:
%Vor%Sie können sehen, dass das Verhalten einfach den Datenkontext des Textfelds und seinen Bindungsausdruck für "Text" abruft. Dann verwendet es die Reflektion, um das Attribut "StringLength" zu erhalten. Die Verwendung ist wie folgt:
%Vor% Sie können diese Funktionalität auch hinzufügen, indem Sie TextBox
erweitern, aber ich benutze gerne Verhalten, weil sie modular sind.
Während ich den Code nicht komplett selbst schreiben werde, ist eine Idee, Ihre eigene MarkupExtension
, die den Namen der Eigenschaft übernehmen und nach einem StringLengthAttribute
suchen.
Wenn das Attribut vorhanden ist, versuchen Sie, das Ziel an diesen Wert zu binden (mithilfe der Reflektion). Wenn nicht, binde 0 an den Zielwert (0 ist Standard, d. H. Kein Maximum).
Eine Möglichkeit wäre, eine Eigenschaft in demselben Ansichtsmodell namens SomePropertyMaxLength zu erstellen und dann die MaxLength-Eigenschaft an diese Eigenschaft zu binden.
%Vor%Die Markup-Erweiterung ist definitiv der richtige Weg. Ich erstelle eine Unterklasse von BindingDecoratorBase namens Binding mit einer Model DataType-Abhängigkeitseigenschaft. Da MarkupExtensions während InitializeComponent () erstellt werden, gibt es keine Möglichkeit, den DataContext zu ermitteln, da er noch nicht festgelegt wurde.
Die Bereitstellung des Modelltyps ermöglicht den reflektiven Zugriff auf Attribute, die im Modell definiert sind. Dies erlaubt:
Das Markup sieht folgendermaßen aus: Text="{PO: Binding DataType = Modell: ModAccount, Pfad = SubAccount}"
Formatierung, MaxLength und Conversion wurden in ein Paket gerollt, ohne dass Änderungen an den Modellklassen erforderlich sind.
Tags und Links wpf c# xaml data-annotations maxlength