2009-09-10 6 views
9

Ok, ich habe mehr Probleme mit meinem C# WPF ListView Steuerelement. Hier ist es in seiner ganzen Pracht:WPF ListView Zugriff auf SelectedItem und Unterelemente

<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> 

Ich Füllen der Listenansicht mit den folgenden:

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 }); 
     } 

Ich bin ein Teufel einer Zeit, die Daten aus einer Reihe abzurufen, wenn es wird doppelt geklickt. Das DoubleClick-Fenster öffnet ein Meldungsfeld mit allen Daten in der Zeile. Ich kann einfach nicht nur die Daten eines Unterpunkts oder einer Zelle abrufen. Sagen Sie eine Zeile hat ISBN: 1234567 Titel: Hurrr Autor: Waldo, wie bekomme ich nur die ISBN oder nur den Titel?

Noch neu zu C# und. Net und schlug meinen Kopf gegen die Wand. Ich denke, das sollte ziemlich einfach sein.

Antwort

26

listView1.SelectedItems[0] gibt eine object zurück. Sie müssen zuerst es auf seinen spezifischen Typ werfen, bevor Sie auf seine Mitglieder zugreifen können. Für das Umwandeln müssen Sie den Namen der zu versorgenden Klasse kennen, aber Sie fügen Ihrer ListView Instanzen einer anonymen Klasse (= hat keinen Namen) hinzu.

Lösung: Definieren Sie eine Klasse (z. B. Book) mit ISBN-, Titel- und Autoreigenschaften, und fügen Sie Instanzen von Book dem ListView hinzu. Dann können Sie die notwendigen Guss tun:

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

Vergessen Sie nicht, wenn Instanzen Book an die Listview hinzuzufügen statt Instanzen eines anonymen Typ:

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

Das macht Sinn! Ich habe ein Klassenbuch hinzugefügt als: public class Buch { public string ISBN {get; einstellen; } öffentliche Zeichenfolge Titel {get; einstellen; } public string Autor {get; einstellen; } } Wenn ich auf eine Zeile doppelklicke, erhalte ich den folgenden Fehler in der von Ihnen bereitgestellten Instantiierungszeile: Kann Objekt vom Typ '<> F_AnonymousType1'3 nicht konvertieren [System.String, System.String, System.String ] 'Geben Sie' Book 'ein – Dave

+1

Sie fügen Ihrem ListView immer noch Instanzen eines anonymen Typs hinzu. Antwort aktualisiert – dtb

+1

Verstanden! Ich verstehe es jetzt, macht Sinn. Vielen Dank! – 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); 
} 

Ich habe Ich habe ein Problem mit dem obigen Code, sobald ich ihn verwende, listet ListView keine dieser Werte auf. Ich weiß nicht, ob das Ihnen hilft oder ob das stimmt, aber nach ein paar Tests habe ich() nach "neues Buch auswählen" hinzugefügt und dann konnte ListView alle Felder korrekt für mich anzeigen.