WPF TextBox MaxLength - Gibt es eine Möglichkeit, diese an die maximale Länge der Datenüberprüfung für das gebundene Feld zu binden?

10

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?

    
michael 05.01.2012, 15:47
quelle

4 Antworten

16

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.

    
McGarnagle 07.02.2013 21:47
quelle
1

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).

    
m-y 05.01.2012 19:18
quelle
0

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%     
evasilchenko 05.01.2012 15:52
quelle
0

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:

  • Einstellung von MaxLength für TextBoxes.
  • Festlegen von StringFormat für TextBlocks.
  • Festlegen des Standardkonverters abhängig vom Elementdatentyp.
  • Hinzufügen der erforderlichen Validierung Verwenden Sie entweder die ValidationRules der Bindung oder ValidatesOnDataErrors.

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.

    
user3326308 09.05.2015 23:13
quelle