Bindung Validierung.HasError-Eigenschaft in MVVM
Ich bin derzeit die Durchführung einer ValidationRule
um zu überprüfen, ob einige ungültige Zeichen in einem Textfeld. Ich bin froh, dass die Einstellung der Klasse habe ich implementiert, erbt ValidationRule
auf meine TextBox setzt es in rot, wenn solche Zeichen gefunden werden, aber ich würde auch gerne die Validation.HasError
Eigentum oder die Validierung.Errors-Eigenschaft auf pop-eine messagebox, die den Benutzer darüber informiert, dass es Fehler in den verschiedenen Textboxen in die Seite.
Gibt es eine Möglichkeit, zu binden, eine Eigenschaft, die in meinem ViewModel
zu den Validation.HasError
und/oder der Validierung.Fehler Eigenschaften in Ordnung für mich, um Zugang zu Ihnen haben, in meinem ViewModel?
Hier ist mein Fehler-style für die TextBox:
<Style x:Key="ErrorValidationTextBox" TargetType="{x:Type pres:OneTextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right"
Foreground="Red"
FontSize="12pt"
Text="{Binding ElementName=MyAdorner,
Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
</TextBlock>
<AdornedElementPlaceholder x:Name="MyAdorner"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Hier ist, wie erkläre ich meiner TextBox (OneTextBox kapselt die regelmäßige WPF-TextBox -) in meinem XAML:
<pres:OneTextBox Watermark="Name..." Margin="85,12,0,0" Style="{StaticResource ErrorValidationTextBox}"
AcceptsReturn="False" MaxLines="1" Height="22" VerticalAlignment="Top"
HorizontalAlignment="Left" Width="300" >
<pres:OneTextBox.Text>
<Binding Path="InterfaceSpecification.Name" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<interfaceSpecsModule:NoInvalidCharsRule/>
</Binding.ValidationRules>
</Binding>
</pres:OneTextBox.Text>
</pres:OneTextBox>
Ja, wie bei meinem Gültigkeitsregel, das einzige was passiert, ist, dass die Grenze meiner TextBox wird rot. Es verhindert nicht, dass Benutzer von der Eingabe von weiteren Zeichen (auch wenn es ein ungültiges Zeichen ist die Name-Eigenschaft hält aktualisiert werden) oder es nicht verhindern, dass ihm die Schaffung einer InterfaceSpecification mit diesem Namen. Ich konnte binden Sie die Validierung.HasError Sie auf den "submit" - button von meiner form, aber ich bin mit einem benutzerdefinierten Rahmen und haben keinen Zugriff auf die Schaltfläche (als privat im Formular-Steuerelement, leider).
InformationsquelleAutor Choub890 | 2014-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
Validation.HasError
ist readonly Eigenschaft, daherBinding
wird nicht funktionieren mit dieser Eigenschaft. Dies kann gesehen werden inILSpy
:Als alternative, sollten Sie sehen, eine große
article
bietet eine Lösung in form der Nutzung befestigt Abhängigkeit Eigenschaften, dort finden Sie eine detaillierte Erläuterung des Beispiels.Unten ist ein vollständiges Beispiel aus diesem Artikel, den ich gerade übersetzte es unter
C#
, die ursprüngliche Sprache istVB.NET
:XAML
Code-behind
Als eine alternative zu der Verwendung von
ValidationRule
im MVVM-Stil, können Sie versuchen, zu implementierenIDataErrorInfo
- Schnittstelle. Für mehr info sehen:Durchsetzung von Komplexen Business-Daten Regeln mit WPF
Sie könnte verhindern, dass sich der Wert im viewmodel gesetzt, in den setter-wenn der neue Wert ungültig ist, aber die Erhöhung INotifyPropertyChanged event, so dass die textbox aktualisiert wird mit dem alten Wert, der nicht geändert werden.
Dies funktioniert gut mit normalen xaml, aber in einem benutzerdefinierten Steuerelement, wenn ich versuche, Sie zu binden, die angefügte Eigenschaft mithilfe einer Vorlage-Bindung, die BindingOperations.IsDataBound(d,MVVMHasErrorProperty) - Aufruf in CoerceMVVMHasError(...) den Wert false zurück, so wird die callback wird nie installiert. Irgendwelche Ideen, wie man diese Arbeit in einem custom control?
Stewart: Können Sie ein konkretes Beispiel für die non-working-Projekt? Wie wird die Zeit, ich werde es sehen.
Nikolajew: ich fügte hinzu, ein Beispiel, wie eine Antwort auf diese Frage zeigt, dass Sie Ihre Technik arbeitet mit standard-XAML, und nicht arbeiten, wenn das XAML-Code in ein benutzerdefiniertes Steuerelement. Danke!
InformationsquelleAutor Anatoliy Nikolaev
In Reaktion auf Anatoliy Antrag für ein Beispiel eines nicht-arbeiten-Projekt:
Generika.xaml
TextBoxCustomControl.cs
HasErrorUtility.cs
ViewModel.cs
MainWindow.xaml
Validation.HasError
in Erster Linie benötigt, wenn mitValidationRule
,in deinem Beispiel ist es nicht. Zusätzlich, in meinem computer (Windows 7), beide Beispiele return false in der Zwingen() - Funktion. Die Bedeutung von diesem Beispiel, dassBinding
funktioniert nicht inValidation.HasError
standardmäßig, da sich diese Eigenschaft nicht eine Abhängigkeitseigenschaft, und dieses Beispiel gleicht diesen Nachteil.Außerdem,in der Ihr benutzerdefiniertes Steuerelement, das Sie sind, einfach die Zuweisung einer booleschen Wert einer Abhängigkeitseigenschaft -> in dieser situation Zwingen die Funktion wird normalerweise nicht aufgerufen werden, in HasErrorUtility.InformationsquelleAutor Brian Stewart