2009-09-10 1073 views
9

Ok, estoy teniendo más problemas con mi control C# WPF ListView. Aquí está en todo su esplendor:WPF Listview Acceso a SelectedItem y a los subelementos

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

estoy llenando la vista de lista con lo siguiente:

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

Estoy teniendo un diablo de un tiempo de recuperación de datos de una fila cuando se se hace doble clic. DoubleClick abre un cuadro de mensaje con todos los datos de la fila, parece que no puedo obtener solo un subelemento o datos de la celda. Digamos que una fila tiene ISBN: 1234567 Título: Hurrr Autor: Waldo, ¿cómo recupero el ISBN o solo el título?

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

Todavía nuevo para C# y .Net y golpeando mi cabeza contra la pared. Me imagino que esto debería ser bastante simple.

Respuesta

26

listView1.SelectedItems[0] devuelve object. Primero necesita convertirlo a su tipo específico antes de poder acceder a sus miembros. Para el casting, necesita saber el nombre de la clase a la que desea realizar el envío, pero está agregando instancias de una clase anónima (= no tiene nombre) a su ListView.

Solución: defina una clase (por ejemplo, Book) con ISBN, Título y Propiedades de autor y agregue instancias de Book a ListView. A continuación, puede hacer necesario el elenco:

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

No se olvide de añadir instancias si Book a la ListView en lugar de las instancias de un tipo anónimo:

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

¡Eso tiene perfecto sentido! Agregué un libro de la clase como: public class Libro { cadena pública ISBN {get; conjunto; } cadena pública Título {get; conjunto; } cadena pública Author {get; conjunto; } } Cuando hago doble clic en una fila, aparece el siguiente error en la línea de creación de instancias del libro que proporcionó: No se puede convertir el objeto del tipo '<> F_AnonymousType1'3 [System.String, System.String, System.String ] 'para escribir' Libro ' – Dave

+1

Aún está agregando instancias de tipo anónimo a su ListView. Respuesta actualizada – dtb

+1

¡Entendido! Lo entiendo ahora, tiene sentido. ¡Gracias! – 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); 
} 

tengo Obtuve un problema con el código anterior, una vez que lo uso, mi listView no muestra ninguno de esos valores. No sé si eso te ayudará o si eso es correcto, pero después de algunas pruebas agregué() después de "seleccionar nuevo libro" y luego ListView podría mostrar todos los campos correctamente para mí.