WPF列表视图访问所选项目和子项

17

好的,我的 C# WPF ListView 控件又出了更多问题。以下是完整的代码:

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

我正在使用以下内容填充listView:

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

我在双击行时难以检索数据。 双击会弹出一个消息框,其中包含行中的所有数据,但我似乎无法仅获取一个子项或单元格的数据。 如果一行具有ISBN:1234567标题:Hurrr作者:Waldo,我该如何只检索ISBN或仅检索标题?

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

我还是C#和.Net的新手,并一直在苦苦思索。我想这应该很简单。

3个回答

33

listView1.SelectedItems[0]返回一个object对象。在您访问其成员之前,您需要首先将它转换为特定类型。要进行转换,您需要知道要转换的类的名称,但是您正在向ListView添加匿名类实例(即没有名称的类)。

解决方法:定义一个带有ISBN、标题和作者属性的类(例如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; set; } public string Title { get; set; } public string Author { get; set; } }当我双击一行时,我会在您提供的Book实例化行上收到以下错误: 无法将类型为'<>F_AnonymousType1'3[System.String, System.String, System.String]'的对象强制转换为类型'Book' - Dave
1
你仍然在将匿名类型的实例添加到你的ListView中。回答已更新。 - dtb
1
谢谢,伙计。这对我很有用;-) - Mohammad Dayyan
同时,Book book = (Book)listView1.SelectedItems[0]; 可以使用 var book = (Book)listView1.SelectedItems[0]; - fedeteka

2

只是想让代码更清晰明了

获取选定的项目

XAML:

<ListView Name="TheList" SelectionChanged="TheList_SelectionChanged"/>

CS:

private void TheList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MyItemClass SelectedItem = (MyItemClass)TheList.SelectedItem;

    if (SelectedItem != null)
        MessageBox.Show(SelectedItem.Title);
}

对于双击项目(几乎相同)

XAML:

<ListView Name="TheList" MouseDoubleClick="TheList_MouseDoubleClick"/>

CS:

private void TheList_SelectionChanged(object sender, MouseButtonEventArgs e)
{
    MyItemClass SelectedItem = (MyItemClass)TheList.SelectedItem;

    if (SelectedItem != null)
        MessageBox.Show(SelectedItem.Title);
}

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就没有列出任何值。我不知道这是否能帮助你或者是否正确,但经过几次测试后,我在"select new Book"后面添加了(),然后ListView就可以正确地显示所有字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接