WPF-TextBox MaxLength — gibt es eine Möglichkeit, binden diese an die Validierung von Daten Max Länge auf das gebundene Feld?
ViewModel:
public class MyViewModel
{
[Required, StringLength(50)]
public String SomeProperty { ... }
}
XAML:
<TextBox Text="{Binding SomeProperty}" MaxLength="50" />
Gibt es eine Möglichkeit zu vermeiden, die MaxLength der TextBox überein meinem ViewModel (was könnte sich ändern, da es in einer anderen assembly) und haben es automatisch die max Länge basierend auf dem StringLength-Bedarf?
InformationsquelleAutor michael | 2012-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich eine Verhalten , schließen Sie das Textfeld, um die gebundene Eigenschaft validation-Attribut (falls vorhanden). Das Verhalten sieht so aus:
Können Sie sehen, das Verhalten ruft einfach die Daten, die Rahmen der TextBox, und die Bindung Ausdruck für "Text". Dann verwendet reflektion, um die "StringLength" - Attribut. Die Nutzung ist wie folgt:
Könnte man auch hinzufügen dieser Funktionalität durch die Erweiterung
TextBox
, aber ich mag mit Verhaltensweisen, weil Sie modular sind.InformationsquelleAutor McGarnagle
Während ich werde nicht schreiben Sie den code komplett selbst, eine Idee ist, erstellen Sie Ihre eigenen
MarkupExtension
nehmen, dass der name der Eigenschaft und reflektieren über die Suche nach einemStringLengthAttribute
.Wenn das Attribut vorhanden ist, werden versuchen zu binden ist das Ziel, dass Wert (mit Reflexion). Wenn nicht, dann binden Sie 0, um den Ziel-Wert (0 ist default, d.h. nicht max.).
InformationsquelleAutor m-y
Einen Weg, es zu tun wäre, um eine Eigenschaft erstellen, die im selben viewmodel genannt SomePropertyMaxLength, und binden die MaxLength-Eigenschaft auf die Eigenschaft.
Sie können Ihre "SomeProperty" werden, um ein Objekt mit dem string-Wert und der maxlength-Wert und binden Sie an die Eigenschaften, beziehungsweise. Auf diese Weise werden Sie nicht haben, um neue Eigenschaften erstellen, aber Sie haben noch zu gehen durch die xaml-änderungen.
InformationsquelleAutor evasilchenko
Die Markup-Erweiterung ist definitiv der Weg zu gehen.
Ich bin der Erstellung einer Unterklasse von BindingDecoratorBase genannt, Verbindlich, das ist ein Modell, Datentyp Abhängigkeitseigenschaft. Als MarkupExtensions werden während der InitializeComponent () - es gibt keinen Weg, um zu bestimmen, den DataContext, da es noch nicht festgelegt wurde.
Bietet das Modell erlaubt reflektierenden Zugriff auf die Attribute definiert, die sich auf das Modell.
Dies ermöglicht:
Markup sieht wie folgt aus:
Text="{PO:Bindung DataType=Modell:modAccount, Path=Unterkonto}"
Formatierung, MaxLength, und die Umstellung gerollt in einem Paket mit keine Notwendigkeit, etwas zu ändern, als die model-Klassen ändern.
InformationsquelleAutor user3326308