好的,我的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的新手,我的头靠在墙上。我认为这应该很简单。
答案 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);
}