【问题标题】:WPF Listview Access to SelectedItem and subitemsWPF Listview 访问 SelectedItem 和子项
【发布时间】:2010-11-27 00:51:26
【问题描述】:

好的,我的 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 还是新手,我的头撞到了墙上。我认为这应该很简单。

【问题讨论】:

    标签: c# wpf listview selecteditem


    【解决方案1】:

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

    【讨论】:

    • 这很有意义!我添加了一本课本: public class Book { public string ISBN { get;放; } 公共字符串标题 { 获取;放; } 公共字符串作者 { 获取;放;当我双击一行时,我在您提供的 Book 实例化行上收到以下错误:无法将类型为 'F_AnonymousType1'3[System.String, System.String, System.String]' 的对象转换为类型'书'
    • 您仍在向 ListView 添加匿名类型的实例。答案已更新。
    • 知道了!我现在明白了,有道理。谢谢!
    • 谢谢老兄,这对我很有用;-)
    • 也可以将Book book = (Book)listView1.SelectedItems[0];用作var book = (Book)listView1.SelectedItems[0];
    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:
          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 可以为我正确显示所有字段。

      【讨论】:

        猜你喜欢
        • 2014-11-04
        • 2023-03-25
        • 2011-01-18
        • 2011-02-06
        • 2023-04-06
        • 1970-01-01
        • 2013-10-09
        • 2020-11-08
        • 2018-07-07
        相关资源
        最近更新 更多