C# 获取wpf中SelectedItem的值

C# 获取wpf中SelectedItem的值,c#,wpf,listbox,C#,Wpf,Listbox,我在WPF页面中有一个列表框,其中每个项目都由两个标签组成。我给他们起了名字名字名字,姓氏: <ListBox.ItemTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/>

我在WPF页面中有一个列表框,其中每个项目都由两个标签组成。我给他们起了名字名字名字,姓氏:

<ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Name="FirstName" Text="{Binding FirstName}" Margin="0,0,10,0"/>
                <TextBlock Grid.Column="1" Name="LastName" Text="{Binding LastName}" HorizontalAlignment="Left"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
但是我在字符串的定义中得到了一个nullReferenceException?这样有什么不对?如何获取SelectedItem值

更新:绑定值源自带有SQL查询的SQLAdapter。请参阅后面的代码:

SqlDataAdapter dAdapt1 = new SqlDataAdapter(sqlStr1, cnStr);

        DataSet dataSet1 = new DataSet();
        dAdapt1.Fill(dataSet1);

        List1.DataContext = dataSet1.Tables[0];

正如Andy已经评论的那样,
List1.SelectedItem
不是
ListItemCollection
,因此您不能强制转换为该类型,因此
lbi
null

在数据模板中,您将绑定到属性
FirstName
LastName
。必须有一个类定义这些属性,我们称之为
Person

我猜是这样的,因为你还没有展示。您正在将列表框的
ItemSource
绑定到
Person
对象的集合,这些对象由
dataSet1.Tables[0]
返回的对象的某些属性提供(因为您将
List1.DataContext
设置为该值)

因此,要获得所选项目,您必须编写以下内容:

Person lbi = List1.SelectedItems as Person;

并用应用程序中真正的类型替换
Person

正如Andy已经评论的那样,
List1.SelectedItem
不是
ListItemCollection
,因此无法转换为该类型,因此
lbi
null

在数据模板中,您将绑定到属性
FirstName
LastName
。必须有一个类定义这些属性,我们称之为
Person

我猜是这样的,因为你还没有展示。您正在将列表框的
ItemSource
绑定到
Person
对象的集合,这些对象由
dataSet1.Tables[0]
返回的对象的某些属性提供(因为您将
List1.DataContext
设置为该值)

因此,要获得所选项目,您必须编写以下内容:

Person lbi = List1.SelectedItems as Person;
并将
Person
替换为应用程序中的任何类型。

DataTable和ListBox## myDataSet.BookTable。第一列和最后一列

装订就绪

一,

二,

装订开始

3.XAML

<ListBox ItemsSource="{Binding Path=BookTable}"  
绑定端

六,

数据表和列表框## myDataSet.BookTable。第一列和最后一列

装订就绪

一,

二,

装订开始

3.XAML

<ListBox ItemsSource="{Binding Path=BookTable}"  
绑定端

六,


您是否调试过这个,并逐步查看什么是空的?如果我不得不猜测,我会说将所选项目强制转换为ListItemCollection返回null。所选项目的类型不是ListItem吗?是的,我相信它是ListItem,但我想从中获得两个值(FirstName,LastName)。这就是我要找的。我尝试使用ListItemCollection,但它似乎不起作用。ListBox.ItemsSource中存储的元素的类型是什么?您是否可以扩展上面的xaml代码片段以显示如何设置它?您是否调试过它并逐步查看什么是空的?如果我不得不猜测,我会说将所选项目强制转换为ListItemCollection返回null。所选项目的类型不是ListItem吗?是的,我相信它是ListItem,但我想从中获得两个值(FirstName,LastName)。这就是我要找的。我尝试使用ListItemCollection,但它似乎不起作用。ListBox.ItemsSource中存储的元素的类型是什么?您可以扩展上面的xaml代码片段来说明如何设置它吗?好的,但是类Person的形式是什么,以便创建包含SelestedItem内容的对象?问题是我无法将SelectedItem“拆分”为FirstName和LastName。这就是我问题的重点。我想您可以在列表框中看到
FirstName
/
LastName
组合,其中必须有一个对象是这些属性的所有者。每个ListBox项都有一个这样的“person”对象。
SelectedItem
的类型与“person”对象的类型相同。查看
dataSet1.Tables[0]
以了解项目的类型。@arjacsoh您的
列表框中存储的项目类型是什么?如果它是一个
DataRow
,那么你的
SelectedItem
将是一个
DataRow。
如果它是一个
Person
类,那么
SelectedItem
将是一个
Person
类。好的,但是类Person的形式是什么,才能创建包含selesteeditem内容的对象呢?问题是我无法将SelectedItem“拆分”为FirstName和LastName。这就是我问题的重点。我想您可以在列表框中看到
FirstName
/
LastName
组合,其中必须有一个对象是这些属性的所有者。每个ListBox项都有一个这样的“person”对象。
SelectedItem
的类型与“person”对象的类型相同。查看
dataSet1.Tables[0]
以了解项目的类型。@arjacsoh您的
列表框中存储的项目类型是什么?如果它是一个
DataRow
,那么你的
SelectedItem
将是一个
DataRow。
如果它是一个
Person
类,那么
SelectedItem
将是一个
Person
类。你完全得到了我想要的。尤其是行:DataRowView d1=List1.SelectedItem作为DataRowView;单靠一个人就足以解决我的问题。谢谢你得到了我想要的。尤其是行:DataRowView d1=List1.SelectedItem作为DataRowView;单靠一个人就足以解决我的问题。谢谢
<ListBox ItemsSource="{Binding Path=BookTable}"  
<DataTemplate x:Key="BookItemTemplate">
                <Grid>
  <TextBlock Text="{Binding Path=first}" Grid.Column="0"/> 
  <TextBlock Text="{Binding Path=last}" Grid.Column="1" /> 
ItemTemplate ="{StaticResource BookItemTemplate}"/>
DataRowView d1=List1.SelectedItem as DataRowView;
string first =d1["first"].tostring();
string last =d1["last"].tostring();