Je lie une vue à un viewmodel et je n'arrive pas à initialiser une zone de liste déroulante à une valeur par défaut. Une simplification de la classe que je utilise dans la liaison estLa zone de liste des données de Siliverlight n'affiche pas la valeur initialisée
public class LanguageDetails
{
public string Code { get; set; }
public string Name { get; set; }
public string EnglishName { get; set; }
public string DisplayName
{
get
{
if (this.Name == this.EnglishName)
{
return this.Name;
}
return String.Format("{0} ({1})", this.Name, this.EnglishName);
}
}
}
Le combobox est déclaré en XAML comme
<ComboBox x:Name="LanguageSelector" Grid.Row="0" Grid.Column="1"
SelectedItem="{Binding SelectedLanguage,Mode=TwoWay}"
ItemsSource="{Binding AvailableLanguages}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayName}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
et viewmodel contient ce code
private List<LanguageDetails> _availableLanguages;
private LanguageDetails _selectedLanguage;
public LoginViewModel()
{
_availableLanguages = LanguageManager.GetLanguageDetailsForSet(BaseApp.AppLanguageSetID);
_selectedLanguage = _availableLanguages.SingleOrDefault(l => l.Code == "en");
}
public LanguageDetails SelectedLanguage
{
get { return _selectedLanguage; }
set
{
_selectedLanguage = value;
OnPropertyChanged("SelectedLanguage");
}
}
public List<LanguageDetails> AvailableLanguages
{
get { return _availableLanguages; }
set
{
_availableLanguages = value;
OnPropertyChanged("AvailableLanguages");
}
}
de la vue à la fin du constructeur à la fois les variables _availableLanguages et _selectedLanguage sont définies comme prévu, la liste déroulante de la liste déroulante contient tous les éléments dans _availableLanguages mais la valeur sélectionnée n'est pas affichée dans la combobox. La sélection d'un élément dans le menu déroulant l'affiche correctement et définit la propriété SelectedLanguage dans le modèle de vue. Un point d'arrêt dans le setter révèle que _selectedLanguage contient toujours ce à quoi il a été initialisé jusqu'à ce qu'il soit écrasé par une valeur.
Je soupçonne qu'il y a quelque chose qui me manque, mais après avoir essayé différentes choses et beaucoup de googler je suis toujours perplexe. Je pourrais atteindre le résultat souhaité d'autres façons, mais je veux vraiment avoir une idée de l'utilisation correcte de la liaison de données.
Merci. Je l'ai découvert via des points d'arrêt tels que vous les décrivez avant de voir votre réponse. Je dois dire qu'il me vient à l'esprit que l'ordre des attributs dans XAML est significatif; Je n'aurais jamais pensé que ce serait le cas. –