J'ai deux projets. L'un travaille et l'autre n'est pas cependant les différences entre eux n'est rien qui je pense "devrait" être d'importance. Le premier projet est celui qui est cassé et c'est celui que j'essaie de réparer. Le deuxième projet est un petit exemple de projet que j'ai créé lorsque le premier projet ne fonctionne tout simplement pas. Bien sûr, l'échantillon fonctionne parfaitement.Combobox ne se lie pas correctement à SelectedItem
Voici la vue du premier projet. J'ai enlevé un tas de "MainWindowTabControlStyle" parce que c'est juste la zone de liste déroulante qui est cassée. Je suis certain que le problème n'est pas dans le style parce qu'il s'agit d'un copier-coller du projet qui fonctionne.
<Grid>
<TabControl Style="{DynamicResource MainWindowTabControlStyle}">
<TabItem Header="Tab 1"/>
<TabItem Header="Tab 2"/>
</TabControl>
</Grid>
<Style x:Key="MainWindowTabControlStyle" TargetType="{x:Type TabControl}">
...
<ComboBox
HorizontalAlignment="Right"
VerticalAlignment="Top"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Subscriptions, Mode=Default}"
SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}"
ItemTemplate="{DynamicResource SubscriptionsItemTemplate}"/>
...
</Style>
<DataTemplate x:Key="SubscriptionsItemTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=DisplayName, Mode=Default}"/>
</StackPanel>
</DataTemplate>
Voici le modèle de vue défini sur le DataContext de MainWindow. La classe ViewModelBase est exactement le même code que Josh Smith a écrit dans cet article MSDN mois.
public sealed class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
}
private ObservableCollection<Subscription> subscriptions;
public ObservableCollection<Subscription> Subscriptions
{
get
{
if (subscriptions == null)
{
subscriptions = new ObservableCollection<Subscription>();
subscriptions.Add(new Subscription() { DisplayName = "ABC" });
subscriptions.Add(new Subscription() { DisplayName = "XYZ" });
subscriptions.Add(new Subscription() { DisplayName = "PDQ" });
}
return subscriptions;
}
set { subscriptions = value; }
}
private Subscription selectedSubscription;
public Subscription SelectedSubscription
{
get { return selectedSubscription; }
set { selectedSubscription = value; }
}
}
Quand je lance le projet du débogueur la première réflexion qui est appelé est le getter pour la collection Les souscriptions. Alors le setter est appelé sur SelectedSubscription (c'est null). Après cela, je peux changer l'élément sélectionné dans la liste déroulante jusqu'à ce que je sois bleu dans le visage et le setter pour la propriété SelectedSubscription ne soit pas modifié à nouveau. Il est important de noter que la liste déroulante contient les valeurs correctes. Dans le second projet, le code est identique mais la première chose appelée est le setter pour la propriété SelectedSubscription (elle est null), puis le getter pour la collection Subscriptions est appelé et enfin le setter pour SelectedSubscription est appelé deuxième fois et il a une valeur qui correspond au premier élément de la collection Abonnements.
Ce petit bijou m'a coûté environ 5 heures si vous avez des idées, je suis prêt à l'essayer.
Merci
J'ai essayé cela mais cela ne fonctionne pas. L'une des choses que j'essayais de souligner dans le post original est que j'ai un autre projet avec exactement les mêmes View et ViewModel ... copier et passer la ligne pour la ligne. L'autre projet fonctionne bien. –
En fait, après avoir posté que j'ai commencé à avoir des problèmes de liaison avec une liste déroulante Silverlight, alors c'est peut-être contagieux. – geofftnz