Warum funktioniert WPF Style zum Anzeigen von Validierungsfehlern in ToolTip für eine TextBox, aber für eine ComboBox?
Ich bin mit einem typischen Stil für die Anzeige der Validierungsfehler als tooltip aus IErrorDataInfo für ein Textfeld wie unten gezeigt, und es funktioniert gut.
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Aber wenn ich versuche, das gleiche zu tun, für eine ComboBox wie dies scheitert es
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Den Fehler bekomme ich in der Ausgabe-Fenster:
System.Windows.Datenfehler: 17 : Cannot get 'Item[]' value ('ValidationError') von '(Validierung.Fehler)' (Typ 'ReadOnlyObservableCollection`1'). BindingExpression:Path=(0)[0].ErrorContent; DataItem='ComboBox' (Name='ownerComboBox'); target element is 'ComboBox' (Name='ownerComboBox'); target property is 'ToolTip' (Typ 'Object') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: das Angegebene argument lag außerhalb des Bereichs Gültiger Werte.Parameter name: index"
Seltsam es auch versucht, ungültige Datenbank-änderungen, wenn ich das Fenster schließen wenn ich alle ComboBox-Werte (Dies gilt auch bei der verbindlichen Fehler Auftritt)!!!
Kann nicht eingefügt werden der Wert NULL in Spalte 'EmpFirstName' Tabelle 'OITaskManager.dbo.Mitarbeiter'; Spalte erlaubt keine null-Werte zulassen. INSERT schlägt fehl.
Die Anweisung wurde beendet.
Einfach kommentieren den Stil alles andere funktioniert perfekt. Wie kann ich dieses Problem beheben?
Nur für den Fall jemand braucht es eine der comboBox' xaml folgt:
<ComboBox ItemsSource="{Binding Path=Employees}"
SelectedValuePath="EmpID"
SelectedValue="{Binding Path=SelectedIssue.Employee2.EmpID,
Mode=OneWay, ValidatesOnDataErrors=True}"
ItemTemplate="{StaticResource LastNameFirstComboBoxTemplate}"
Height="28" Name="ownerComboBox" Width="120" Margin="2"
SelectionChanged="ownerComboBox_SelectionChanged" />
<DataTemplate x:Key="LastNameFirstComboBoxTemplate">
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{1}, {0}" >
<Binding Path="EmpFirstName" />
<Binding Path="EmpLastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
SelectionChanged: (ich planen, zu implementieren, der befiehlt vor dem langen, aber, wie dies ist mein erstes WPF-Projekt, an dem ich nicht Weg voller MVVM noch. Ich bin versucht, die Dinge in kleinen und mittleren beißt)
//This is done this way to maintain the DataContext Integrity
//and avoid an error due to an Object being "Not New" in Linq-to-SQL
private void ownerComboBox_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
Employee currentEmpl = ownerComboBox.SelectedItem as Employee;
if (currentEmpl != null &&
currentEmpl != statusBoardViewModel.SelectedIssue.Employee2)
{
statusBoardViewModel.SelectedIssue.Employee2 = currentEmpl;
}
}
InformationsquelleAutor der Frage Mike B | 2010-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihrer immer diesen Fehler, weil, wenn Sie die Validierung findet, gibt es keine Probleme, die Errors-Auflistung zurückgibt, ohne Elemente, und die folgende verbindliche Logik versagt:
Zugriff auf die Validierung Sammlung von einem bestimmten index. Ich arbeite aktuell an einem DataTemplate Vorschlag für den Ersatz dieser text.
Ich Liebe es, dass Microsoft aufgeführt diese in Ihr standard-Beispiel für eine überprüfung-Vorlage.
update so ersetzen Sie den obigen code mit dem folgenden, und die Bindung Logik wissen, wie man mit den leeren validationresult-Sammlung:
(folgende xaml-Code wurde Hinzugefügt, wie ein Kommentar)
InformationsquelleAutor der Antwort Nathan Tregillus
Versuchen die Konverter für die Konvertierung in ein multi-line string, wie beschrieben, hier
InformationsquelleAutor der Antwort djamwal
Gesehen hab ich den code, die Sie verwenden veröffentlicht, die in mehreren Orten, aber es scheint mir komisch, dass
nicht erhöhen roten Fahnen. Aber ich bin auch neu in WPF und vielleicht gibt es ein Geheimnis zu machen, dass in jedem Fall funktioniert.
Eher als der Versuch der index eine möglicherweise leere Kollektion mit einem array-index, fügen Sie einen Konverter gibt der erste Fehler in der Liste.
InformationsquelleAutor der Antwort David
Ich denke, dies ist der beste Weg:
/
ist eigentlich gleichCurrentItem
von @NathanIn meinem Fall
CurrentItem
ist ein no go.InformationsquelleAutor der Antwort Altiano Gerung