在我的项目中,我有一个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);
}
}
答案 0 :(得分:1)
mylist.SelectedItem
和object
,你需要问自己为什么。它只是一个占位符,还是有理由让他们给你一个对象
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
函数。