【问题标题】:Getting An Object From A Listview从列表视图中获取对象
【发布时间】:2018-02-23 13:35:28
【问题描述】:

在我的项目中,我有一个绑定到对象的 observablecollection 的列表视图,我有一个在列表视图中获取所选项目的事件,我需要将项目作为 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; }

列表视图 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);
        }
    }

【问题讨论】:

  • 如何将它们插入到列表视图中?如果它是卡片,那么只需var card = (Card)obj;
  • 使用直接转换:var card = (Card)mylist.SelectedItem.
  • @RacilHilan 当我这样做时,所有对象属性都显示为空。
  • 这就是假设您将ListView 绑定到Card 对象列表的方式。如果不查看您的代码,我们将无法为您提供帮助。

标签: c# visual-studio listview object observablecollection


【解决方案1】:

mylist.SelectedItem 是和object,你需要问问自己为什么。它只是一个占位符还是他们给你一个对象的原因

Boxing and Unboxing (C# Programming Guide)

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

Listbox 的作者不想将您锁定为任何特定类型,而是希望允许您使用任何类型。因此拳击。他们将结果存储在object 中,并让您自行转换(取消装箱)类型。当您考虑它时,它安静方便,更不用说 .net 的基本设计考虑了

(Card)mylist.SelectedItem

【讨论】:

  • 在问这里之前我自己试过了,但是 Card 总是为空,这就是我在这里问的原因。
  • 我实际上是个白痴,我总是得到空值的原因是我从错误的列表视图中获取了选定项。这只是一个逻辑错误,我花了 3 个小时才意识到。无论如何感谢您的回答,如果不是这里的答案,我可能不会意识到。
【解决方案2】:

用途:

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

     // Your code here
}

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

【讨论】:

  • 请解释一下你做了什么。避免只回答代码
  • 直接案例就足够了。无需承担检查null 的成本,也无需在其余代码中处理Nullable 对象。
【解决方案3】:

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

MouseLeftButtonDownListView 中实际选择项目之前引发。如果您想使用该事件,您需要先检查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);
        }
    }
}

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

MouseLeftButtonDown="DoubleClickAdd"

到:

SelectionChanged="DoubleClickAdd"

我还将重命名 DoubleClickAdd 函数。

【讨论】:

  • 感谢您的回答,我刚刚意识到我实际上是从错误的列表视图中获取所选项目,这就是为什么它总是返回一个空对象。一个愚蠢的错误,花了我 3 个小时的时间。感谢您帮助我发现错误。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
相关资源
最近更新 更多