C# 将DataTable绑定到ComboBox,返回所选项目WPF c的主键#

C# 将DataTable绑定到ComboBox,返回所选项目WPF c的主键#,c#,wpf,data-binding,wpf-controls,C#,Wpf,Data Binding,Wpf Controls,这似乎是一个非常简单的问题,但我就是搞不懂(我是XAML新手)。我通过将comboBox绑定到datatable来填充它。我的表中的主键是S_ID,我需要检索SelectionChanged事件中所选项目的此值,以便根据此值加载更多详细信息。我尝试了int I=cboSites.SelectedItem,但即使S_ID是int,也会得到类型不匹配。如果我将I设置为type object,我可以在调试模式下的DatarRowView中查看该值,但无法以任何其他方式访问数据。请让我知道我做错了什么。

这似乎是一个非常简单的问题,但我就是搞不懂(我是XAML新手)。我通过将comboBox绑定到datatable来填充它。我的表中的主键是S_ID,我需要检索SelectionChanged事件中所选项目的此值,以便根据此值加载更多详细信息。我尝试了int I=cboSites.SelectedItem,但即使S_ID是int,也会得到类型不匹配。如果我将I设置为type object,我可以在调试模式下的DatarRowView中查看该值,但无法以任何其他方式访问数据。请让我知道我做错了什么。我做了大量的研究,从我所读的代码看来是可以的,但显然不是!顺便说一下,组合框中填充的数据非常好。非常感谢

C#

XAML


使用SelectedValue而不是SelectedItem:

<ComboBox ItemsSource="{Binding}" DisplayMemberPath="S_Name" 
          SelectedValuePath="S_ID" SelectedValue="{Binding Path=Int_Property_In_The_ViewModel}"/>

由于集合中的每个项都像是要绑定到的DataView中的表中的一行,因此您得到的类型不匹配。因此,在您的位置选择更改后,您可以获得类似以下内容的S\u ID:

var s_id = int.Parse(((DataRowView)cboSites.SelectedItem)["S_ID"].ToString());

在这里,您正在铸造
cboxSites。选择editem
to
DataRowView
type,然后使用索引器获取S_ID值。然后,您只需将该值转换为字符串并将其解析为整数变量。

感谢您的快速回复!我试过了,现在如果我用以下代码调试-var I=cboSitesForTurbine.SelectedValue-在SelectionChanged中我得到I=null。。。有什么想法吗?太棒了,很有效,非常感谢。我不可能自己想出如何铸造那种类型!我认为在WPF中绑定的想法是在XAML中完成大多数事情,并使事情变得更简单。为了得到那个值,这看起来有点复杂!再次感谢。
SELECT 
[S_ID],
[S_Name]
FROM
[dbo].[tbl_Site]
WHERE [C_ID] = @CUSTID       
<ComboBox ItemsSource="{Binding}" DisplayMemberPath="S_Name" 
          SelectedValuePath="S_ID" SelectedValue="{Binding Path=Int_Property_In_The_ViewModel}"/>
var s_id = int.Parse(((DataRowView)cboSites.SelectedItem)["S_ID"].ToString());