2011-01-17 3 views
4

Ich habe ein Pivot-Steuerelement, wo sein Element eine Listbox mit Elementen enthält. Wenn ich zum nächsten Pivot-Element blättern muss, dauert die Datenbindung einige Zeit, und ich möchte wissen, wann die Datenbindung abgeschlossen ist, da ich die Menüleiste aktivieren muss, sobald die Listbox angezeigt wird. Ich konnte keine Veranstaltung finden, die mir hier helfen kann. Ich habe versucht, das Loaded-Ereignis der Listbox, aber während es für einige Pivot-Elemente funktioniert, für einige andere wird es nicht ausgelöst! Ich habe auch versucht, das Layout aktualisiert Ereignis, aber es ist zu oft gefeuert und es kann mir nicht helfen.Wie kann ich überprüfen, wann die Datenbindung einer Liste abgeschlossen ist? (wp7)

Was könnte ich tun? danke

Antwort

1

Um eine gute Leistung beim schnellen Scrollen durch Pivot-Objekte zu gewährleisten, sollten Sie warten, bis der SelectedIndex geändert wurde, um den Inhalt eines Pivot-Elements zu binden. Auf diese Weise wird nicht versucht, zu binden, während der Benutzer schnell zwischen Pivot-Elementen wischt. Es wird nur gebunden, wenn Sie auf einem Pivot-Element anhalten.

Sie sollten dann die ItemsSource-Eigenschaft der ListBox in Ihrem Pivot-Element im LayoutUpdated-Ereignis festlegen. Ich benutze die folgende Erweiterungsmethode:


     public static void InvokeOnLayoutUpdated(this FrameworkElement element, Action action) 
     { 
      if (element == null) 
      { 
       throw new ArgumentNullException("element"); 
      } 
      else if (action == null) 
      { 
       throw new ArgumentNullException("action"); 
      } 

      // Create an event handler that unhooks itself before calling the 
      // action and then attach it to the LayoutUpdated event. 
      EventHandler handler = null; 
      handler = (s, e) => 
      { 
       element.LayoutUpdated -= handler; 
       action(); 
      }; 
      element.LayoutUpdated += handler; 
     } 

So würden Sie dann einen Code haben, die in etwa so aussah:


pivot.InvokeOnLayoutUpdate(() => 
    { 
    Dispatcher.BeginInvoke(() => 
     { 
     list.ItemsSource = source; 
     ApplicationBar.IsMenuEnabled = true; 
     }); 
    }); 
+0

Warum Dispatch.BeginInvoke, sein ein 'LayoutUpdated' Ereignis sicher, dass Feuer auf der Benutzeroberfläche Faden? – AnthonyWJones

+0

Wahr; wird fast sicher nicht benötigt. Ich benutze tatsächlich eine andere Erweiterung mthod, um auf dem UI-Thread aufzurufen, wenn es nicht eigentlich der UI-Thread ist, aber das der Kürze halber weggelassen wurde :) –

+0

es ist eine nette Arbeit herum, aber wie kann ich die Datenbindung stoppen, wenn der selectedIndex Änderungen? Während der Datenbindung läuft der Pivot nicht auf Gesten, und wenn ich eine Geste vor Abschluss der Datenbindung mache, wird sie nach dem Laden der Daten ausgeführt. Es sieht so aus, als ob der Pivot sich an meine Bewegungen erinnert und sich um sie kümmert, nachdem die Datenbindung abgeschlossen ist, selbst wenn ich dabei IsHitTestVisible auf false setze. – johnX99

Verwandte Themen