2009-09-10 16 views
9

OK, mam więcej problemów z moją kontrolką ListView WP # C#. Oto ona w całej okazałości:WPF Listview Dostęp do wybranych pozycji i podelementów

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

jestem napełniania ListView z następujących czynności:

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

mam diabła w czasie pobierania danych z rzędu, kiedy to jest podwójne kliknięcie. DoubleClick wyskakuje okienko z wszystkimi danymi w wierszu. Po prostu nie mogę uzyskać tylko jednego podelementu lub danych komórki. Powiedz, że wiersz ma numer ISBN: 1234567 Tytuł: Hurrr Autor: Waldo, jak mogę po prostu pobrać ISBN lub po prostu tytuł?

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

Wciąż nowy w C# i .Net i waląc głową w ścianę. Myślę, że to powinno być raczej proste.

Odpowiedz

26

listView1.SelectedItems[0] zwraca wartość object. Najpierw musisz uzyskać przesłać go do określonego typu,, zanim uzyskasz dostęp do jego członków. Do przesyłania musisz znać nazwę klasy, do której chcesz przesyłać, ale dodajesz do Analizy instancję anonimową klasę (= nie ma nazwy).

Rozwiązanie: Zdefiniuj klasę (np. Book) z właściwościami ISBN, Tytuł i Autor i dodaj wystąpienia Book do ListView. Następnie można wykonać niezbędną Obsada:

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

Nie zapomnij dodać instancje jeśli Book do ListView zamiast instancji typu anonimowego:

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

To ma sens! Dodałem książkę klasy jako: public class Book { public string ISBN {get; zestaw; } public string Tytuł {get; zestaw; } public string Autor {get; zestaw; } } Po dwukrotnym kliknięciu wiersza pojawia się następujący błąd w podanej linii tworzenia instancji Book: Nie można rzutować obiektu typu "<> F_AnonymousType1'3 [System.String, System.String, System.String ] ", aby wpisać" Book " – Dave

+1

Nadal dodajesz do Analizy ListView wystąpienia anonimowego typu. Odpowiedź zaktualizowana. – dtb

+1

Gotowy! Rozumiem to teraz, ma sens. Dzięki! – 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); 
} 

mam Mam problem z powyższym kodem, kiedy go użyję, mój listView nie podał żadnej z tych wartości. Nie wiem, czy to ci pomoże, czy jest to poprawne, ale po kilku testach dodałem() po "wybierz nową książkę", a następnie ListView mógł dla mnie poprawnie wyświetlić wszystkie pola.

Powiązane problemy