WPF Listview访问SelectedItem和子项

时间:2009-09-10 00:46:42

标签: c# wpf listview selecteditem

好的,我的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 });
        }

我有一次在双击时从一行中检索数据的魔鬼。 DoubleClick会弹出一个包含行中所有数据的消息框,我似乎无法只获取一个子项或单元格的数据。说一行有ISBN:1234567标题:Hurrr作者:Waldo,我如何只检索ISBN或只是标题?

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

仍然是C#和.Net的新手,我的头靠在墙上。我认为这应该很简单。

3 个答案:

答案 0 :(得分:29)

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 :(得分: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没有列出任何这些值。我不知道这是否会对你有所帮助,或者如果这是正确的,但经过几次测试后,我在(#34)之后添加()选择新书&#34;然后ListView可以正确显示所有字段。

答案 2 :(得分:0)

只想使代码更清晰

获取所选项目

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