这似乎是一个非常简单的问题,但我无法弄明白(我是XAML的新手)。我通过将它绑定到数据表来填充组合框。我的表中的主键是S_ID,我需要为SelectionChanged事件中选择的项检索此值,以便我可以根据此值加载更多详细信息。我尝试过int i = cboSites.SelectedItem,但即使S_ID是int,也会出现类型不匹配的情况。如果我将i设置为对象类型,但是无法以任何其他方式访问数据,我可以在调试模式下查看DatarRowView中的值。请让我知道我做错了什么。我做了很多研究,从我看到的代码看起来没问题,但显然不是!顺便说一句,组合框填充数据绝对精细。非常感谢。
C#
try
{
SqlDataAdapter sqlAd = new SqlDataAdapter();
SqlCommand sqlComm = new SqlCommand("SP_SelectAllSiteNamesForCust", sqlConn);
sqlComm.CommandType = System.Data.CommandType.StoredProcedure;
DataSet dSet = new DataSet();
sqlAd.SelectCommand = sqlComm;
sqlAd.Fill(dSet);
DataTable sitesTable = dSet.Tables[0];
cboSites.ItemsSource = sitesTable.DefaultView;
}
XAML
<ComboBox Height="28" IsEditable="True" Margin="630,15,28,10"
Name="cboSites" TabIndex="6"
ItemsSource="{Binding}"
DisplayMemberPath="S_Name"
SelectedItem="{Binding Path=S_ID}"
SelectionChanged="cboSites_SelectionChanged" />
SQL存储过程
SELECT
[S_ID],
[S_Name]
FROM
[dbo].[tbl_Site]
WHERE [C_ID] = @CUSTID
答案 0 :(得分:1)
使用SelectedValue而不是SelectedItem:
<ComboBox ItemsSource="{Binding}" DisplayMemberPath="S_Name"
SelectedValuePath="S_ID" SelectedValue="{Binding Path=Int_Property_In_The_ViewModel}"/>
答案 1 :(得分:0)
您遇到的类型不匹配,因为集合中的每个项目都类似于您绑定到的DataView表中的一行。所以在你的cboSites_SelectionChanged中,你可以得到类似这样的S_ID:
var s_id = int.Parse(((DataRowView)cboSites.SelectedItem)["S_ID"].ToString());
在这里,您将cboxSites.SelectedItem
转换为DataRowView
类型,然后使用索引器获取S_ID值。然后你只需将该值转换为字符串并将其解析为整数变量。