Quando un dizionario viene enumerato, produrrà KeyValuePair<TKey,TValue>oggetti ... quindi è sufficiente specificare "Valore" e "Chiave" rispettivamente per DataTextFielde DataValueFieldper selezionare le proprietà Valore / Chiave .
Grazie al commento di Joe, ho riletto la domanda per ottenerli nel modo giusto. Normalmente mi aspetto che la "chiave" nel dizionario sia il testo visualizzato e il "valore" sia il valore recuperato. Tuttavia, il codice di esempio li utilizza al contrario. A meno che tu non abbia davvero bisogno che siano in questo modo, potresti prendere in considerazione la possibilità di scrivere il tuo codice come:
list.Add(cul.DisplayName, cod);
(E poi cambiando l'associazione per usare "Chiave" per DataTextFielde "Valore" per DataValueField, ovviamente.)
In effetti, suggerirei che, poiché sembra che tu voglia davvero un elenco piuttosto che un dizionario, potresti voler riconsiderare l'utilizzo di un dizionario in primo luogo. Potresti semplicemente usare un 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));
}
In alternativa, utilizza un elenco di CultureInfovalori semplici . LINQ lo rende davvero semplice:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Se non stai usando LINQ, puoi comunque usare un normale ciclo foreach:
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();