web-dev-qa-db-ja.com

SelectedItemおよびサブアイテムへのWPFリストビューアクセス

わかりました。C#WPFListViewコントロールでさらに問題が発生しています。ここにそれはすべての栄光にあります:

<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は、行のすべてのデータを含むメッセージボックスをポップアップします。サブアイテムまたはセルのデータを1つだけ取得できないようです。行にISBN:1234567があるとします。タイトル:Hurrr作成者:Waldo、ISBNまたはタイトルだけを取得するにはどうすればよいですか。

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

C#と.Netはまだ新しく、壁に頭をぶつけています。これはかなり単純なはずだと思います。

12
Dave

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);
}
29
dtb
    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ですべてのフィールドが正しく表示されます。

0
Robert Stepien