2009-09-10 28 views
9

Ok, tôi gặp nhiều vấn đề hơn với điều khiển ListView C# WPF của tôi. Dưới đây là trong tất cả vinh quang của nó:Truy cập danh sách WPF Truy cập vào SelectedItem và các phụ đề

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

Tôi điền vào ListView như sau:

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

Tôi gặp một con quỷ của một thời gian lấy dữ liệu từ một hàng khi nó được nhấp đúp. DoubleClick thực hiện bật lên một hộp thông báo với tất cả dữ liệu trong hàng, tôi dường như không thể chỉ nhận được một dữ liệu phụ hoặc ô. Nói một hàng có ISBN: 1234567 Tiêu đề: Hurrr Tác giả: Waldo, làm thế nào để tôi lấy lại ISBN hoặc chỉ tiêu đề?

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

Vẫn còn mới đối với C# và .Net và đập đầu vào tường. Tôi hình dung điều này khá đơn giản.

Trả lời

26

listView1.SelectedItems[0] trả về số object. Trước tiên, bạn cần phải truyền nó đến loại cụ thể trước khi bạn có thể truy cập các thành viên của nó. Để truyền, bạn cần biết tên của lớp để truyền tới, nhưng bạn đang thêm các trường hợp của một lớp vô danh (= không có tên) vào ListView của bạn.

Giải pháp: Xác định một lớp (ví dụ: Book) với các thuộc tính ISBN, Tiêu đề và Tác giả và thêm các trường hợp Book vào ListView. Sau đó, bạn có thể làm các diễn viên cần thiết:

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

Đừng quên để thêm các trường hợp nếu Book vào ListView thay vì trường hợp của một loại vô danh:

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

Điều đó có ý nghĩa hoàn hảo! Tôi đã thêm một cuốn sách lớp học là: lớp học công khai Sách { chuỗi công khai ISBN {get; bộ; } chuỗi công khai Tiêu đề {get; bộ; } chuỗi công khai Tác giả {get; bộ; } } Khi tôi nhấp đúp vào một hàng, tôi nhận được lỗi sau trên dòng instantiation Sách bạn đã cung cấp: Không thể truyền đối tượng thuộc loại '<> F_AnonymousType1'3 [System.String, System.String, System.String ] 'để nhập' Sách ' – Dave

+1

Bạn vẫn đang thêm trường hợp của một loại ẩn danh vào ListView của bạn. Đã cập nhật câu trả lời. – dtb

+1

OK! Tôi hiểu ngay bây giờ, có ý nghĩa. Cảm ơn! – 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); 
} 

Tôi có gặp vấn đề với mã ở trên, khi tôi sử dụng nó, listView của tôi không liệt kê bất kỳ giá trị nào trong số đó. Tôi không biết nếu điều đó sẽ giúp bạn hoặc nếu đó là chính xác nhưng sau một vài bài kiểm tra tôi đã thêm() sau khi "chọn sách mới" và sau đó ListView có thể hiển thị tất cả các lĩnh vực chính xác cho tôi.

Các vấn đề liên quan