2009-08-31 6 views
2

Je suis perplexe ici. J'ai une collection observable qui contient des objets métier. Je l'ai lié à ItemsSource d'un ListBox. Je suis en train de mettre à jour le X et Y de mon objet et il est affiché correctement dans l'interface utilisateur pendant l'exécution car il est lié à l'élément haut et à gauche. Mais, voici où le problème est. J'ai également lié certaines données à afficher dans la propriété de texte textblock et les données n'affiche que la valeur initiale. Il ne met jamais à jour le texte Textblock, peu importe combien de fois je le change.Articles dans ObservableCollection ne mettant pas à jour la vue

Voici le code XAML. Si vous voyez un problème avec le XAML s'il vous plaît faites le moi savoir. Comme je l'ai dit, la liaison X/Y - Top/Left fonctionne très bien et se met à jour quand elle est modifiée, le TextBlock lié à DisplayData ne fonctionne pas.

En outre, mon objet métier dans ma collection implémente INotifyPropertyChanged.

Je vais essayer de faire une petite démonstration pour répliquer ceci si une réponse ne peut pas être donnée simplement en regardant le XAML.

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="614" Width="674"> 

<ListBox Name="PlottingBox" Background="White"> 

    <ListBox.ItemTemplate> 

     <DataTemplate> 

      <TextBlock Text="{Binding Path=DisplayData}" /> 

     </DataTemplate> 

    </ListBox.ItemTemplate> 

    <ListBox.Template> 

     <ControlTemplate TargetType="{x:Type ListBox}"> 

      <Border Background="{TemplateBinding Background}" 

       BorderBrush="{TemplateBinding BorderBrush}" 

       BorderThickness="{TemplateBinding BorderThickness}"> 

       <Canvas IsItemsHost="True" /> 

      </Border> 

     </ControlTemplate> 

    </ListBox.Template> 

    <ListBox.ItemContainerStyle> 

     <Style TargetType="{x:Type ListBoxItem}"> 

      <Setter Property="Canvas.Left" Value="{Binding Path=PlotX}" /> 

      <Setter Property="Canvas.Top" Value="{Binding Path=PlotY}" /> 

     </Style> 

    </ListBox.ItemContainerStyle> 

</ListBox> 

Répondre

5

Je pense que le problème est dans le code derrière. Votre XAML est absolument légal et semble bon. Mais avant de poster le code source assurez-vous que les conditions suivantes sont remplies:

  1. Votre objet métier implémente l'interface INotifyPropertyChanged et vous soulevez événement PropertyChanged chaque fois que la valeur DisplayData est modifiée.

  2. Il n'y a pas de fautes de frappe. Ni dans la définition de propriété DipslayData ni dans PropertyChangedEventArgs, où vous passez le nom de la propriété "DispayData".

  3. Le DataContext d'un ListBoxItem est du type de votre objet métier. Vérifiez-le avec Snoop.

  4. Il n'y a pas d'erreur de liaison en cours d'exécution. Exécutez votre application dans le débogage et vérifiez votre fenêtre de sortie. Vous pouvez également vérifier cela avec Snoop.

Espérons qu'après avoir rempli cette liste de contrôle, vous aurez la réponse.

cheers :)

+0

Anvaka, Merci d'avoir regardé ça. 1. Oui. 2. Vérifié et OK. 3. N'a pas encore vérifié. 4. Aucune erreur de liaison. J'ai créé une petite application pour reproduire cette situation et la petite application fonctionne parfaitement. Donc vous avez absolument raison, ça DOIT être dans mon codebehind. Je vais parcourir le code et rendre compte. Merci encore. – Doug

+0

Anvaka vous aviez raison. Le problème était dans mon codebehind. Un problème STUPD, STUPID. Je n'ai jamais mis à jour DisplayData après Sub New. DOH! Désolé si j'ai perdu votre temps. Doug – Doug

+0

Je suis content que vous ayez trouvé la réponse :). Toutes nos félicitations! – Anvaka

1

Vos objets métier doivent implémenter l'interface INotifyPropertyChanged, de sorte que l'interface utilisateur est informé du changement et peut mettre à jour pour refléter la nouvelle valeur

+1

Oui c'est le cas, j'ai déclaré que dans le ci-dessus. – Doug

0

Uhm, le DataContext dans la zone de liste est un élément de la liste ItemsSource. Par exemple, si vous ListBox est lié à un ObservableCollection, le DataContext à l'intérieur de la ListBox sera un objet Person et non le datacontext du parent. Par exemple:

Si vous avez un TextBlock avec une liaison, la liaison pointe vers un objet Person, en d'autres termes, personInstance.DisplayData et non parentDC.DisplayData.

Je ne connais pas le comportement sans ItemsSource.

Peut-être le savez-vous, mais peut-être que cela vous aide.

Questions connexes