如何使用Linq和C#3.5从ComboBox中的SelectedItem获取值

我真的错过了匿名类型的东西,因为我无法弄清楚如何处理Combobox.SelectedItem属性。

这是填充combobox的代码,它工作得很好

var stocks = from st in brdc.tb_dStocks join su in brdc.tb_rStockUsers on st.StockID equals su.StockID where su.UserID == userRec.UserID select new { st.StockID, su.StockUserID, st.Ticker }; cboStocks.ItemsSource = stocks; cboStocks.DisplayMemberPath = "Ticker"; 

然后,当有人使用cboStockscombobox选择一个项目时,我需要弄清楚该项是什么,但我不知道该怎么做。 显然,这是一个简单的问题,但它让我很困惑。 cboStocks.SelectedItem是一个对象,该对象是Linq创建的匿名类型,但这是我能想到的。

匿名类型只对方法有用(并且应该只使用)。 在这里,您在初始化combobox时在一种方法中创建类型,然后在读取所选项目时尝试在另一种方法中访问它。 这不会起作用。

您需要创建一个实际类型以分配给combobox的ItemsSource

不幸的是,没有反思就没有好办法做到这一点。 匿名类型实际上并不意味着在没有一些大的reflection框架的情况下从后面进行存储和检索以检查它们。 它们几乎只是为了在内部重新排列数据的方法中临时方便而设计的。

我建议你用相同的三个字段创建一个命名类型; 那么投出它并获得你想要的东西是一件小事。

不久前在此博客上找到以下方法,请尝试以下方法:

 private List MakeList(T itemOftype) { List newList = new List(); return newList; } //create a fake type for anonymous type var stockType = new {StockID = 0, StockUserId =0, Ticker = string.Empty}; var listOfStocks = MakeList(stockType); var listOfStocksAnonymous = from st in brdc.tb_dStocks join su in brdc.tb_rStockUsers on st.StockID equals su.StockID where su.UserID == userRec.UserID select new { st.StockID, su.StockUserID, st.Ticker }; listOfStocks = listOfStocksAnonymous.ToList(); //now you have a direct access to all anonymous properties 

我同意ChrisF。 你应该在这里使用具体类型。 但是,如果您想尝试这个解决方法:

 T Cast(object obj, T type) { return (T)obj; } ... var myItem = Cast(cboStocks.SelectedItem, new { st.StockID = 0, su.StockUserID = 0, st.Ticker = "" }); ... 

所以这就是我最终做的,似乎工作得很好

 private class StockInfo { public int StockID { get; set; } public int StockUserID { get; set; } public string Ticker { get; set; } public StockInfo(int stockID, int stockUserID, string ticker) { StockID = stockID; StockUserID = stockUserID; Ticker = ticker; } } BaxRunDataContext brdc = new BaxRunDataContext(); IEnumerable stocks = from st in brdc.tb_dStocks join su in brdc.tb_rStockUsers on st.StockID equals su.StockID where su.UserID == userRec.UserID select new StockInfo(st.StockID, su.StockUserID, st.Ticker); cboStocks.ItemsSource = stocks; cboStocks.DisplayMemberPath = "Ticker";