2009-02-16 5 views
5

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

Répondre

0

Désolé pour le retard dans l'obtention d'une réponse posté. Il y avait une sorte de problème avec l'ouverture d'un ID Open.

Ceci est un problème très sérieux.

La résolution de ce problème ne provenait pas du tout de la fenêtre. Avant l'appel de la méthode show de la fenêtre, une autre fenêtre s'ouvrait en tant que boîte de dialogue. Dans cette boîte de dialogue il y avait la ressource suivante

<Window.Resources> 
    <DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/> 
</Window.Resources> 

Il a été référencé par deux TextBlocks dans la même fenêtre comme « DynamicResource ». Après avoir désactivé la boîte de dialogue et démarré l'application avec les fenêtres qui avaient le problème, il a été découvert que le problème était causé par la fenêtre de dialogue. Pendant que je faisais des recherches sur le problème, un collègue m'a suggéré de transformer DynamicResource en une StaticResource car il n'y avait pas de raison pour qu'elle soit dynamique.

Cette modification dans une boîte de dialogue utilisant une ressource qui n'était disponible que dans le cadre de la fenêtre de dialogue a permis de résoudre le problème de liaison décrit ci-dessus dans la "Fenêtre principale". Je suppose que des choses étranges peuvent arriver.

1

éventuellement changer

SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}" 

à

SelectedItem="{Binding Path=SelectedSubscription, Mode=TwoWay}" 
+1

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. –

+0

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

0

La bonne façon de déboguer est de prendre le projet de travail et en alternance (modifier pour correspondre au code cassé/confirmation ça marche) jusqu'à ce qu'il soit identique au projet cassé ou qu'il casse. Le point où il casse vous indique où le problème est. La modification du projet interrompu est généralement une cause perdue. En second lieu, je vous recommande d'ajouter l'espace de noms System.Diagnostics à votre XAML. Il fera apparaître des erreurs dans la fenêtre Visual Studio Output.

xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase" 

En tant que point connexe peut-être (en ce sens qu'il est pas vraiment clair quel est le problème dans le projet cassé est), vous pourriez jeter un oeil à this StackOverflow question (« Combobox contrôlant tabcontrol ») qui se rapporte à:

  • WPF,
  • ComboBoxes,
  • TabControls et
  • liaison entre les utilisant SelectedIndex.

Il n'y a pas encore de solution à cette question, mais c'est un problème plus simple.

Enfin, Josh Smith's MSDN code est assez grand. Il est difficile de comprendre ce que vous avez modifié pour ajouter votre ComboBox sans voir tout le code.

Questions connexes