Silverlight DataGrid-automatische Auswahl bei der Einstellung ItemSource/DataContext, Sortierung,
Gibt es eine Möglichkeit, schalten Sie die automatische Auswahl der ersten Zeile in der integrierten DataGrid in Silverlight?
Bauen wir eine Menge von Funktionen auf der Grundlage der Benutzer durch das auswählen einer Zeile im Daten-grid. Die automatische Zündung des SelectionChanged-wenn databinding oder Sortieren ist wirklich verursachen uns Probleme. Wir haben versucht, einige Wachen rund um die Auswahl, kann aber nicht scheinen, erhalten Sie alle Probleme abgedeckt.
Zum Beispiel, wenn Sie haben DataGrid in einem tab von TabControl wird nicht angezeigt, wenn der Bildschirm geladen und das DataGrid hat eine Bindung an eine Eigenschaft DataContext, der eine Liste von Objekten. Das raster ist nicht Datenbindung, bis die Registerkarte wird angezeigt. Gibt es ein Ereignis, die uns erzählen, dass das raster databinding? Sollte nicht das Standard-Verhalten von databinding nicht um eine Zeile zu wählen?
Dank
Mike
InformationsquelleAutor Mike Schall | 2008-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, die Einstellung ein Boolesches Feld (ex. bool dataGridFirstLoad), die Sie auf false gesetzt, die in Ihrem User-Control-Konstruktor.
Dann auf das SelectionChanged-Ereignis des DataGrid-Steuerelements, überprüfe ob dataGridFirstLoad ist falsch. Wenn false auf true festgelegt, und legen Sie die SelectedItem auf null.
Hoffe, das hilft.
InformationsquelleAutor ptio
Mike,
Ich habe dieses problem gelöst, indem er die windows-Systemsteuerung, und fangen die Auswahl-changed-Ereignis des eingebundenen windows-raster.
In Ihrer Kontrolle, hook up das Loaded-Ereignis des Steuerelements, und wenn es geladen ist, setzen Sie den booleschen private member-variable auf true. Dann, wenn Sie fangen die inneren Daten raster Auswahl changed-Ereignis, nur heben Sie Ihre eigene Auswahl changed-Ereignis, wenn Sie die Steuerelement geladen wird. Wenn dies erledigt ist, können Sie jetzt gehen Sie zurück zu der OnApplyTemplate sub, und setzen Sie Ihre innere Daten raster ausgewählten index auf -1, und das ausgewählte Element zu nichts. Seit der Einstellung des index und Element passieren wird, bevor Sie Ihre Kontrolle vollständig geladen ist, wird die Auswahl geändert-Ereignis wird nicht ausgelöst. Ich habe versucht, diese sowohl in einem tabbed-und non-tabbed-Umgebung, und es scheint zu funktionieren ohne Problem. Nun zu ein bisschen schwieriger problem, Sie haben vielleicht bemerkt, dass beim Sortieren der windows-Daten-grid (es ist zwar Daten an eine ItemsSource -) es wählt immer das oberste Element des angezeigten Daten. Dies wird natürlich -, Feuer-die Auswahl geändert-Ereignis, und verschieben Sie auf ein Element, das vorher nicht ausgewählt war, und soweit ich das sehen kann, sollte nicht ausgewählt werden. Um dies zu umgehen, müssen Sie ein bisschen trickreicher Codierung. Wenn Sie bemerken, wenn Sie fangen die inneren Gitter s selection changed-Ereignis, und seinen Blick auf das ausgewählte Element, es gibt nur wenige Fälle, in denen der ausgewählte Artikel ist nicht auf etwas, das sind, wenn es nicht mehr ein Element, ausgewählt ist (dh. die Auswahl deaktiviert ist), oder wenn (HINT) sind die Spalten Sortieren. Wenn Sie die Sortierung, gibt es zwei Ereignisse, Feuer, erste ist die de-Auswahl Element (SelectedItem ist Nichts), und die zweite ist die Auswahl der top-Artikel in der Liste (SelectedIndex 0). Nun, wenn Sie setzen ein flag in der Ereignisprozedur für das innere Gitter Auswahl changed-Ereignis, und erregte die Tatsache, dass der Artikel nichts, Sie konnte verfolgen das zuvor gewählte Element, und legen Sie dann die innere Daten raster ausgewählte Element zu dem zuvor ausgewählten Element.
Löst dies das problem anständig, gut, und wie immer kann es zu unerwünschten Ergebnissen beim wickeln ein windows-Steuerelement, aber soweit ich das beurteilen kann, scheint dies der einzige Weg, um die erste Zeile ausgewählt, auf laden problem. Ich kann mir nur vorstellen, jedoch, dass dies behoben werden, indem M$ irgendwann.
Ich hoffe, das hilft,
Dank,
Scott
InformationsquelleAutor Scott
dies ist ähnlich wie die oben genannten Beiträge (und hashes, die aus Paulo T-Vorschlag). Dies funktioniert sehr gut.
//das selectionchanged-handler im xaml oder im Konstruktor
//Ich habe 2 Netze auf meiner Seite, also ich erstelle eine boolean-Eigenschaft für jedes
InformationsquelleAutor Aligned
Dem folgenden code sollte es tun (set JustRefreshed auf true, wenn Sie aktualisieren/refresh grid):
InformationsquelleAutor
Da der code für das DataGrid-Steuerelement wurde von Microsoft zur Verfügung, wir entfernt die Auswahl, so dass wir nicht haben, um um ihn zu arbeiten. Ich glaube, dies ist nicht länger ein Problem mit dem Silverlight-3.0-grid.
InformationsquelleAutor Mike Schall