WPF Listview Доступ к SelectedItem и подразделам - PullRequest
12 голосов
/ 10 сентября 2009

Хорошо, у меня больше проблем с моим элементом управления 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 Автор: Уолдо, как мне просто получить ISBN или просто название?

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

Все еще новичок в C # и .Net и стучит головой об стену. Я полагаю, это должно быть довольно просто.

Ответы [ 2 ]

29 голосов
/ 10 сентября 2009

listView1.SelectedItems[0] возвращает object. Сначала вам нужно привести его к определенному типу , прежде чем вы сможете получить доступ к его членам. Для приведения типов вам нужно знать имя класса, в который вы хотите выполнить приведение, но вы добавляете экземпляры анонимного класса (= не имеет имени) в свой ListView.

Решение: Определите класс (например, Book) со свойствами ISBN, Title и Author и добавьте экземпляры 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);
}
0 голосов
/ 29 января 2016
    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 мог бы показать все поля для меня правильно.

...