2009-09-10 8 views
9

Ok, j'ai plus de problèmes avec mon contrôle C# WPF ListView. Ici, il est dans toute sa splendeur:WPF Listview Accès à SelectedItem et aux sous-éléments

<Window x:Class="ebook.SearchResults" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="ISBNListView" Height="503" Width="1004"> 
<Grid> 
    <ListView Name="listView1" Margin"22,30,33,28" MouseDoubleClick="getSelectedItem" > 

     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn Header="ISBN" Width="150" DisplayMemberBinding="{Binding ISBN}"/> 
        <GridViewColumn Header="Title" Width="350" DisplayMemberBinding="{Binding Title}"/> 
        <GridViewColumn Header="Author" Width="350" DisplayMemberBinding="{Binding Author}" /> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

Je remplis ListView ce qui suit:

XDocument xdoc = XDocument.Load(GlobalVars.docPath + "\\tempSearchResults.xml"); 
     var items = from item in xdoc.Descendants("Book") 
        select new 
        { 
         ISBN = item.Element("ISBN").Value, 
         Title = item.Element("Title").Value, 
         AuthTexts = item.Element("Author").Value 
        }; 
     foreach (var item in items) 
     { 
      listView1.Items.Add(new { ISBN = item.ISBN, Title = item.Title, Author = item.AuthTexts }); 
     } 

J'ai un diable d'un temps de récupération des données à partir d'une ligne quand il est double cliqué. DoubleClick affiche une boîte de message avec toutes les données de la ligne, je n'arrive pas à obtenir un seul sous-élément ou des données de cellule. Dire une ligne a ISBN: 1234567 Titre: Hurrr Auteur: Waldo, comment puis-je récupérer l'ISBN ou juste le titre?

private void getSelectedItem(object sender, MouseButtonEventArgs e) 
    { 
     System.Windows.MessageBox.Show(listView1.SelectedItems[0].ToString()); 
    } 

Encore nouveau pour C# et .Net et me cogner la tête contre le mur. Je pense que cela devrait être plutôt simple.

Répondre

26

listView1.SelectedItems[0] renvoie object. Vous devez d'abord le convertir en son type spécifique pour pouvoir accéder à ses membres. Pour la diffusion, vous devez connaître le nom de la classe à convertir, mais vous ajoutez des instances d'une classe anonyme (= n'a pas de nom) à votre ListView.

Solution: Définissez une classe (par exemple, Book) avec les propriétés ISBN, Titre et Auteur et ajoutez des instances de Book à ListView. Ensuite, vous pouvez faire la distribution nécessaire:

private void getSelectedItem(object sender, MouseButtonEventArgs e) 
{ 
    Book book = (Book)listView1.SelectedItems[0]; 
    System.Windows.MessageBox.Show(book.ISBN); 
} 

Ne pas oublier d'ajouter des instances si Book à la ListView au lieu des instances d'un type anonyme:

var items = from item in xdoc.Descendants("Book") 
      select new Book         // <--- 
      { 
       ISBN = (string)item.Element("ISBN"), 
       Title = (string)item.Element("Title"), 
       Author = (string)item.Element("Author"), 
      }; 

foreach (var item in items) 
{ 
    listView1.Items.Add(item); 
} 
+1

C'est tout à fait logique! J'ai ajouté un livre de classe comme suit: public class Livre { public string ISBN {get; ensemble; } public string Titre {obtenir; ensemble; } public string Auteur {obtenir; ensemble; } } Lorsque je double-clique sur une ligne, j'obtiens l'erreur suivante sur la ligne d'instanciation Book que vous avez fournie: Impossible de convertir un objet de type '<> F_AnonymousType1'3 [System.String, System.String, System.String ] 'taper' Book ' – Dave

+1

Vous ajoutez toujours des instances d'un type anonyme à votre ListView. Réponse mise à jour – dtb

+1

J'ai compris! Je comprends maintenant. Merci! – Dave

0
var items = from item in xdoc.Descendants("Book") 
      select new Book()         // <--- 
      { 
       ISBN = (string)item.Element("ISBN"), 
       Title = (string)item.Element("Title"), 
       Author = (string)item.Element("Author"), 
      }; 

foreach (var item in items) 
{ 
    listView1.Items.Add(item); 
} 

Je J'ai eu un problème avec le code ci-dessus, une fois que je l'ai utilisé, mon listView n'a répertorié aucune de ces valeurs. Je ne sais pas si cela vous aidera ou si c'est correct, mais après quelques tests j'ai ajouté() après "sélectionner un nouveau livre" puis ListView pourrait montrer tous les champs correctement pour moi.