Как получить значения из SelectedItem в ComboBox с Linq и C # 3.5 - PullRequest
2 голосов
/ 27 октября 2009

Мне действительно чего-то не хватает с анонимными типами, потому что я не могу понять, что делать со свойством Combobox.SelectedItem.

Вот код, который заполняет комбинированный список, и он отлично работает

         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";

Затем, когда кто-то выбирает элемент с помощью комбинированного списка cboStocks, мне нужно выяснить, что это за элемент, но я понятия не имею, как это сделать. Понятно, что это простая проблема, но она меня сильно смущает. cboStocks.SelectedItem - это объект, и этот объект имеет анонимный тип, созданный Linq, но это все, что я могу понять.

Ответы [ 5 ]

4 голосов
/ 27 октября 2009

Анонимные типы действительно полезны (и должны использоваться только) с методом. Здесь вы создаете тип в одном методе, когда вы инициализируете поле со списком, а затем пытаетесь получить доступ к нему в другом при чтении выбранного элемента. Это не сработает.

Вам необходимо создать фактический тип для присваивания списку ItemsSource.

.
2 голосов
/ 27 октября 2009

Обнаружил следующий подход в этом блоге некоторое время назад, попробуйте следующее:

private List<T> MakeList<T>(T itemOftype)
{
    List<T> newList = new List<T>();
    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<stockType>();

//now you have a direct access to all anonymous properties  
2 голосов
/ 27 октября 2009

К сожалению, нет хорошего способа сделать это без размышлений. Анонимные типы на самом деле не предназначены для того, чтобы их можно было хранить и извлекать позже, в отсутствие какой-либо большой структуры отражения, чтобы проверить их. Они в значительной степени просто предназначены для временного удобства в методах, которые перераспределяют данные внутри.

Я предлагаю вам сделать именованный тип с теми же тремя полями; тогда бросить его и получить то, что вы хотите, - тривиальное дело.

0 голосов
/ 27 октября 2009

Итак, вот что я в итоге сделал, похоже, работает очень хорошо

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<StockInfo> 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";
0 голосов
/ 27 октября 2009

Я согласен с ChrisF. Вы должны использовать конкретный тип здесь. Однако этот обходной путь работает, если вы хотите попробовать его:

T Cast<T>(object obj, T type)
{
    return (T)obj;
}

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