2010-10-01 6 views
2

hey. J'essaie de maintenir un modèle MVVM, mais je trébuche quelque part en essayant de lier une liste. La première fois que j'exécute l'application, j'ai défini ItemCatalog (ObservableCollection) comme étant une certaine liste ObservableCollection. La zone de liste est vide, mais si j'essaye à nouveau cela fonctionne. Cependant, il existe un décalage entre la source de données et les données affichées. Par exemple,Liaison de liste déroulante - retardée d'une source

I charger l'application -> source réglée à X -> Listbox est vide

I Source maintenant mis à Y -> Listbox affiche X

Je mis la source à Z -> affiche Listbox etc ..

Ceci, pour moi, implique que la liaison fonctionne, mais je ne peux pas comprendre pourquoi il est en retard d'un.

Mon XAML ressemble à ceci:

<ListBox ItemsSource="{Binding ItemCatalog}"> 
     <DataTemplate> 
      <StackPanel Margin="0,0,0,17" Width="432"> 
        <TextBlock Text="{Binding Ref}" TextWrapping="Wrap" Foreground="Black" /> 
        <TextBlock Text="{Binding ItemName}" TextWrapping="Wrap" Margin="12,-6,12,0" Foreground="Black" /> 
      </StackPanel> 
     </DataTemplate> 
</ListBox> 

Dans le ViewModel, la valeur de ItemCatalog est basée sur le bouton que l'utilisateur a appuyé (X, Y, Z), qui sont tous stockés dans une variable statique. Y a-t-il une raison pour laquelle il y a un délai, ou un moyen de forcer à rétablir la dernière valeur ItemCatalog?

Si je supprime la liaison du code XAML et que la source de la liste est définie directement à partir du code-behind, cela fonctionne parfaitement. Cependant, je veux essayer et maintenir le codage XAML. Je suis nouveau à MVVM, donc je pourrais faire ça à l'envers. grâce

EDIT - code supplémentaire

Le code est modifié dans la méthode OnNavigatedTo

 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
     { 


      if (NavigationContext.QueryString["Category"].ToString() == "House") 
      { 
       _categoryType = Models.House; 

      } 
      if (NavigationContext.QueryString["Category"].ToString() == "Car") 
      { 
       _categoryType = Models.Car; 

      } 

      MyViewModel.LoadNewData(_categoryType); 


      base.OnNavigatedTo(e); 
     } 

LoadNewData méthode définit simplement la variable statique en fonction du paramètre passé. Essentiellement, je dois relier après le chargement de la page, via XAML.

Répondre

3

À supposer (puisqu'il n'y a toujours pas assez de code pour continuer) votre ViewModel soulève une modification de propriété avant même que le champ ItemCatalog soit effectivement affecté. Quelque chose comme: -

ObservableCollection<Stuff> _ItemCatalog; 
ObservableCollection<Stuff> ItemCatalog 
{ 

    get { retutn _ItemCatalog; } 
    set 
    { 
     PropertyChanged("ItemCatalog"); 
     _ItemCatalog = value; 
    } 
} 

Cela pourrait entraîner le comportement que vous décrivez.

+0

C'est un bon coup dans le noir! : D J'ai déplacé la méthode NotifyPropertyChange et dans la vue, j'ai mis le DataContext dans l'événement 'PropertChanged' du ViewModel. Je pensais que le DataContext n'aurait besoin d'être défini qu'une fois, mais il semble que je devais le définir chaque fois que l'événement PropertyChange est levé. Merci! – XSL

0

Vous ne montrez pas de code sur l'endroit où vous changez la source de X à y, mais je suppose que le comportement expliqué que la liaison de données sur votre vue est interprétée avant que la modification ait lieu.

+0

Mise à jour de la question avec du code. – XSL

+0

Est-ce que ItemCatalog est une ObservableCollection? – Roadie57

+0

J'ai réussi à le résoudre (cochez la réponse acceptée), mais oui, ItemCatalog est une ObservableCollection. – XSL