2009-09-10 69 views
9

好吧,我的C#WPF ListView控件存在更多問題。這是在其所有的榮耀:WPF Listview訪問SelectedItem和子項

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

我填充以下列表視圖:

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

我有處理時間爲一排,當它恢復數據的魔鬼被雙擊。 DoubleClick會彈出一個消息框,其中包含該行中的所有數據,但我似乎無法獲取僅一個子項或單元格的數據。說一排有ISBN:1234567標題:Hurrr作者:沃爾多,我該​​如何檢索ISBN或只是標題?

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

對C#和.Net仍然陌生,並將我的頭撞向牆壁。我認爲這應該是相當簡單的。

回答

26

listView1.SelectedItems[0]返回object。您首先需要將其轉換爲其特定類型,然後才能訪問其成員。對於投射,您需要知道要投射到的類的名稱,但是您要向ListView添加匿名類(=沒有名稱)的實例。

解決方案:使用ISBN,Title和Author屬性定義一個類(例如,Book),並將Book的實例添加到ListView。然後,你可以做一些必要的轉換:

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

不要忘記實例添加如果Book到ListView,而不是匿名類型的實例:

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

這很有道理!我添加了一本教科書: public class Book { public string ISBN {get;組; } public string Title {get;組; } public string Author {get;組; }} 當我雙擊某行我得到您所提供的圖書實例線以下錯誤: 無法投類型的對象「<> F_AnonymousType1'3 [System.String,System.String,System.String ]'鍵入'Book' – Dave 2009-09-10 01:39:10

+1

您仍然將一個匿名類型的實例添加到您的ListView中。答案已更新。 – dtb 2009-09-10 01:49:28

+1

明白!我現在明白了,很有道理。謝謝! – Dave 2009-09-10 01:59:13

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

我有上面的代碼有問題,一旦我使用它,我的listView沒有列出任何這些值。我不知道這是否會幫助你,或者如果這是正確的,但在「選擇新書」後添加()後進行一些測試,然後ListView可以爲我正確顯示所有字段。