2010-12-17 8 views
0

Ich brauche eine Art von Datenvalidierung in einer WPF-Anwendung zu tun, ich entwickleWPF Validierung innerhalb UI Virtualized ListBox

Soweit ich weiß, wenn Sie ValidatesOnDataErrors=True auf die Bindung hinzufügen, jedes Mal wenn die Bindung gelöst ist (es kann sein, jedes Mal, wenn der Wert sich ändert, kann es sein, wenn Fokus verloren ist), Binding-Engine überprüft die Bindungsquelle, durch IDataErrorInfo, Zugriff auf die Schnittstelle, findet heraus, ob es einen Fehler gibt oder nicht.

Es klingt gut, mit nur einem Vorbehalt. Damit Daten validiert werden können, müssen sie gerendert werden. Wenn Sie eine ObservableCollection dieser Entität haben, die an eine ListBox mit VirtualizingStackPanel.IsVirtualizing=True gebunden ist, werden nur gerenderte Elemente validiert. Da die meisten Elemente außerhalb des Ansichtsfensters liegen, werden sie nicht gerendert.

Wie kann ich jedes Element zur Validierung zwingen? Das Entfernen der UI-Virtualisierung ist keine Option.

Antwort

0

Ich habe einen Weg gefunden, dies zu tun. Es ist hässlich. Aber es funktioniert. Angenommen, die virtualisierte Liste der Benutzeroberfläche lautet myList

for (Int32 i = 0; i < myList.Items.Count; i++) 
{ 
    myList.ScrollIntoView(myList.Items[i]); 
} 
UpdateLayout(); 

Auf diese Weise erhalte ich eine Liste aller Elemente. Ich scrolle die Liste zu jedem Element in dieser Liste. Und ich aktualisiere Layout, weil ScrollIntoView asynchron ist, denke ich. Danach wurde jedes Objekt gerendert, jede Bindung wurde ausgeführt und jede Validierung wurde ausgewertet.

Gibt es bessere Wege da draußen?