Quando um dicionário é enumerado, ele produzirá KeyValuePair<TKey,TValue>
objetos ... então você só precisa especificar "Valor" e "Chave" para DataTextField
e DataValueField
, respectivamente, para selecionar as propriedades Valor / Chave .
Graças ao comentário de Joe, reli a pergunta para entendê-la da maneira certa. Normalmente, eu esperaria que a "chave" no dicionário fosse o texto exibido e o "valor" fosse o valor obtido. No entanto, seu código de amostra os usa ao contrário. A menos que você realmente precise que eles sejam assim, considere escrever seu código como:
list.Add(cul.DisplayName, cod);
(E depois alterando a vinculação para usar "Chave" DataTextField
e "Valor" DataValueField
, é claro.)
Na verdade, eu sugeriria que, como parece que você realmente quer uma lista em vez de um dicionário, você pode querer reconsiderar o uso de um dicionário em primeiro lugar. Você pode simplesmente usar um List<KeyValuePair<string, string>>
:
string[] languageCodsList = service.LanguagesAvailable();
var list = new List<KeyValuePair<string, string>>();
foreach (string cod in languageCodsList)
{
CultureInfo cul = new CultureInfo(cod);
list.Add(new KeyValuePair<string, string>(cul.DisplayName, cod));
}
Como alternativa, use uma lista de CultureInfo
valores simples . LINQ torna isso realmente fácil:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Se você não estiver usando o LINQ, ainda poderá usar um loop foreach normal:
List<CultureInfo> cultures = new List<CultureInfo>();
foreach (string cod in service.LanguagesAvailable())
{
cultures.Add(new CultureInfo(cod));
}
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();