2017-07-10 4 views
1

J'ai récemment découvert la boîte à outils de la communauté UWP et j'ai adoré. J'utilise maintenant le MasterDetailView et c'est presque parfait pour ce dont j'ai besoin: mais il me manque une chose importante: je ne peux pas accéder au "ListView" interne.MasterDetailView UWP - Accéder au ListView (ou le faire défiler)

Dans mon application j'ai deux boutons: en avant et en arrière, et en appuyant sur eux, je vais simplement en avant et en arrière dans la liste. J'ai trouvé une astuce pour accéder au prev/élément suivant fait comme ceci:

public void GoForward() 
    { 
     if (MasterDetailView.Items.Count > 0) 
     { 
      bool isNextGood = false; 
      MyItem selectedItem = MasterDetailView.Items[MasterDetailView.Items.Count - 1] as MyItem; 

      foreach (var v in MasterDetailView.Items) 
      { 
       if (isNextGood) 
       { 
        selectedItem = v as MyItem; 
        break; 
       } 

       if (v == MasterDetailView.SelectedItem) 
        isNextGood = true; 
      } 

      MasterDetailView.SelectedItem = selectedItem; 
     } 
    } 

Ce juste parce que je ne peux pas accéder au « SelectedIndex » et je ne SelectedItem avaiable. Maintenant, évidemment, tout l'élément ne peut pas être visible en même temps, donc MasterDetailView fournit une ListView latérale avec une barre de défilement. Lorsque j'appuie sur les boutons suivant/précédent, SelectedItem change, mais ne fait pas défiler l'élément sélectionné: la sélection avance/recule mais la liste est verrouillée. Cela produit un retour très négatif car j'ai perdu ma sélection quelque part dans la liste et je dois la rechercher.

Comment j'ai résolu de le résoudre? J'essaie ces approches:


1) Trouver le style pour MasterDetailView. A l'intérieur j'ai trouvé un ListViewStyle, donc j'ai essayé de mettre dans un simple événement "SelectionChanged" et de le gérer sur App.xaml.cs.

<ListView x:Name="MasterList" 
             Grid.Row="1" 
             IsTabStop="False" 
             ItemContainerStyle="{TemplateBinding ItemContainerStyle}" 
             ItemTemplate="{TemplateBinding ItemTemplate}" 
             ItemTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
             ItemsSource="{TemplateBinding ItemsSource}" 
             SelectedItem="{Binding SelectedItem, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
             SelectionChanged="MasterList_SelectionChanged"/> 

CS:

private void MasterList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ListView list = sender as ListView; 
     list.ScrollIntoView(list.SelectedItem); 
    } 

Mais, comme on dit, "Les événements ne peuvent être définis dans le fichier de classe d'application XAML".


2) Pensez à prendre le parent de SelectedItem: J'ai essayé de convertir le SelectedItem en ListViewItem, alors l'accès au parent, mais il échoue à la première conversion, comme SelectedItem ne semble pas d'être un ListViewItem, mais il est du type "MyItem". Comme ça, je ne peux pas accéder au parent.

private void MasterDetailView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var item = MasterDetailView.SelectedItem as ListViewItem; 
     var parent = item.Parent; 
     var list = parent as ListView; 
    } 

Et donc je suis ici ... Je ne veux pas jeter tout mon travail avec le MasterDetailView de passer à un autre contrôle. Y at-il une méthode simple pour accéder à la liste, ou simplement, faire défiler la liste lorsque je change de sélection? Je veux juste faire une chose, comme ceci:

private void List_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      ListView list = sender as ListView; 
      list.ScrollIntoView(list.SelectedItem); 
     } 

défiler simplement dans la sélection lorsque la sélection a changé eu lieu, mais je ne ListView simple mais un contrôle MasterDetailView. Même si cela se fait entièrement en XAML: la chose la plus importante pour moi est de faire défiler cette liste!

Merci.


Solution

Cette méthode est fantastique. Il suffit de copier-coller. Ensuite, il suffit de l'utiliser pour récupérer la liste et la faire défiler vers l'avant. Oui bébé!

private void MasterDetailView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var v = FindChildOfType<ListView>(MasterDetailView); 
     v.ScrollIntoView(MasterDetailView.SelectedItem); 
    } 

Veuillez noter que "MasterDerailView" est le nom x: de mon élément, pas de la classe.

+0

'MasterDetailsView' a' événement SelectionChanged' par défaut. '' –

+0

Viajy Nirmal: oui, c'est le cas. Mais il n'a rien de spécial à utiliser. Vous pouvez récupérer comme d'habitude le SelectedItem (c'est un objet MyItem), et la liste de mes objets, mais pas ListView, ni ScrollingEvents. Donc c'est inutile. Je ne peux pas utiliser cet événement pour récupérer la liste. Je sais que EXISTS, mais je ne peux pas accéder à la liste elle-même pour contrôler le défilement – Martinocom

Répondre