从Listview获取对象

时间:2018-02-23 13:35:28

标签: c# visual-studio listview object observablecollection

在我的项目中,我有一个listView绑定到一个observable对象集合,我有一个事件获取listview中的选定项目,我需要将项目作为Card对象,而不仅仅是对象。有没有办法做到这一点?

对象:

public class Card
{
    public string Name { get; set; }
    public string Icon { get; set; }
    public string Image { get; set; }
    public string CMC { get; set; }
    public string Colour { get; set; }
    public string Set { get; set; }
    public string MultiverseID { get; set; }
    public string Power { get; set; }
    public string Toughness { get; set; }
    public string Type { get; set; }
}

收藏品:

public ObservableCollection<Card> SearchedCards { get; set; }

Listview XAML

<ListView Name="List" ItemsSource="{Binding SearchedCards}" Margin="0,41,1568,0" ItemTemplate="{DynamicResource List}"/>

    <DataTemplate x:Key="List">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
            <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                <TextBlock Name="ID" Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Left" Width="215" MouseMove="customHoverEvent" MouseLeftButtonDown="DoubleClickAdd"/>
            </StackPanel>
            <StackPanel Orientation="Vertical" HorizontalAlignment="Right">
                <Image Source="{Binding Icon}" Width="90" Height="16" Margin="0,0,0,0" HorizontalAlignment="Right" MouseMove="hide"/>
            </StackPanel>
        </StackPanel>
    </DataTemplate>

项目获取活动

private void DoubleClickAdd(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount == 2)
        {
            Card item = DeckList.SelectedItem as Card;
            test.Text = item.CMC;
            DeckList.Items.Add(List.SelectedItem);
        }
    }

3 个答案:

答案 0 :(得分:1)

mylist.SelectedItemobject,你需要问自己为什么。它只是一个占位符,还是有理由让他们给你一个对象

Boxing and Unboxing (C# Programming Guide)

  

拳击是将值类型转换为类型对象或的过程   到此值类型实现的任何接口类型。当CLR   选中一个值类型,它将值包装在System.Object和   将其存储在托管堆上。取消装箱从中提取值类型   物体。拳击是隐含的;拆箱是明确的。的概念   装箱和拆箱是类型系统的C#统一视图的基础   其中任何类型的值都可以被视为对象。

Listbox的作者并不想将您锁定为任何特定类型,并希望允许您使用任何类型。因此拳击。他们将结果存储在object中,然后让你自己输入(取消包装)自己的类型。当你想到它时,它的安静方便,更不用说.net

的基本设计考虑了
(Card)mylist.SelectedItem

答案 1 :(得分:0)

使用:

Var card= listbox.SelectedItem as Card; // If not is card return null
if(Card!=null){

     // Your code here
}

as:尝试将对象转换为类型,如果不是返回null,则对象不是描述的类型,然后检查它是否为null有值。

答案 2 :(得分:0)

使用直接投射((Card)DeckList.SelectedItem),而不是as运算符。您已经知道SelectedItem对象的类型,因此无需对as运算符进行额外检查。

MouseLeftButtonDown中实际选择项目之前,ListView被引发。如果您要使用该事件,则需要先检查SelectedItem是否为null并确定相应操作:

private void DoubleClickAdd(object sender, MouseButtonEventArgs e) {
    if (e.ClickCount == 2) {
        if (DeckList.SelectedItem != null) {
            Card item = DeckList.SelectedItem as Card;
            test.Text = item.CMC;
            DeckList.Items.Add(List.SelectedItem);
        }
    }
}

或者,您可以使用在SelectionChanged中实际选择项目后引发的ListView。这可以保证您将获得最后一个选择(不是前一个选择)并且有一个选择(不会是null)。要使用它,请从以下位置更改XAML:

MouseLeftButtonDown="DoubleClickAdd"

为:

SelectionChanged="DoubleClickAdd"

我还要重命名DoubleClickAdd函数。