2016-04-11 26 views
2

Wir haben eine Anforderung, die Bilder in einer GridView inkrementell anzuzeigen. Um also die ausgewählten Objekte in GridView, IsSelected zu finden, hat die Eigenschaft GridView mit der entsprechenden Bindungsobjekteigenschaft CLR object (Eigenschaft des Typs GridView's ItemSource) eine Bindung. Seit unterstützt RelativeSouce und Setter Bindung in Stil nicht, so dass nach einigen Suche im Internet fanden wir den folgenden Code.GridViewItem IsSelected Bindung in UWP App

public class GridViewEx : GridView 
{ 

     protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item) 
     { 
      base.PrepareContainerForItemOverride(element, item); 
      var gridItem = element as GridViewItem; 

      var binding = new Binding { Mode = BindingMode.TwoWay, Source = item, Path = new PropertyPath("IsSelected") }; 
      gridItem.SetBinding(SelectorItem.IsSelectedProperty, binding); 
     } 

} 

Aber es scheint, dass es einen Fehler mit dem obigen Ansatz gibt. Jedes Mal, wenn die Seite zum Laden der nächsten Fotos heruntergerollt wird, verlieren die zuvor ausgewählten Objekte ihre Auswahl.

Hat jemand dieses Problem vor oder irgendwelche Vorschläge erfahren, um das oben genannte Problem zu lösen?

Antwort

0

Verschieben Sie IsSelected in die Modellklasse, und binden Sie sie an ein Benutzersteuerelement. Das Benutzersteuerelement ist tatsächlich die Zelle und wird in Ihre Datenvorlage eingefügt.

<GridView.ItemTemplate> 
    <DataTemplate> 
     <controls:MyCustomControl IsSelected="{Binding IsSelected}"/> 
    </DataTemplate> 
</GridView.ItemTemplate> 

In MyCustomControl, werden Sie Unterschied visuellen Zustand zu zeigen, den gewählten Status von Artikel behandeln. Auf diese Weise muss Ihr ViewModel die Liste überhaupt nicht "kennen", wenn Sie nur eine Liste des ausgewählten Elements aus Ihrer Modellliste abrufen müssen.

+1

Aber wie an GridViewItem.IsSelectedProperty zu binden, um IsSelected im Hintergrund für jedes Benutzer ausgewählte Element auf der Seite festlegen? – user1672994

+0

Wenn Benutzer auf das Objekt tippen, das Modell abrufen, die IsSelected-Eigenschaft abrufen und auf true festlegen. Vergiss 'GridViewItem.IsSelectedProperty', es hat nichts zu tun, da ich es in meinem Beispiel ignoriere. – thang2410199

+0

Jeder? Dies ist wichtig für fast jede Anwendung, die ich kenne und es gibt keine zuverlässige Möglichkeit, dies zu tun. – SuperJMN

Verwandte Themen