2010-12-15 69 views
0

J'essaie de changer dynamiquement le DataContext pour mon application lorsque la sélection d'un élément Pivot change. Tout fonctionne comme je le veux, mais je continue d'obtenir des erreurs dans la fenêtre de sortie du débogueur sur les sources de données qui ne sont pas trouvées dans les ListBox présents dans les éléments PivotItems qui ne sont pas actuellement sélectionnés PivotItem. Par exemple, disons que j'ai 2 PivotItems - PivotItem1 et PivotItem2 - affichant chacun un ListBox chacun - ListBox1 et ListBox2. Maintenant, lorsque PivotItem1 est actif et affiche ListBox1, ListBox2 se plaint que sa source de données n'a pas été trouvée, ce qui est correct car le DataContext actuel ne contient pas la collection à laquelle il est lié. Ceci est l'erreur (je l'ai ajouté des sauts de ligne supplémentaire):Erreur lors de la mise à jour DataContext pour Windows Phone 7 Pivot

System.Windows.Data Error: BindingExpression path error: 
'Entries' property not found on 'MyApp.ViewModels.CategoriesView' 
'MyApp.ViewModels.CategoriesView' (HashCode=79283607). 
BindingExpression: Path='Entries' 
DataItem='MyApp.ViewModels.CategoriesView' 
(HashCode=79283607); target element is 
'System.Windows.Controls.ListBox' (Name='ListBox2'); 
target property is 'ItemsSource' (type 'System.Collections.IEnumerable').. 

De même, lorsque PivotItem2 est actif, ListBox1 génère une erreur. Je suis mise à jour le DataContext dans l'événement LoadingPivotItem du Pivot, j'ai également essayé de le faire dans l'événement LoadedPivotItem mais obtiens la même erreur.

Les deux collections implémentent INotifyPropertyChanged, et comme je l'ai mentionné au début, tout fonctionne, malgré l'erreur. Je voudrais supprimer l'erreur en quelque sorte.

Voici le XAML pour un des ListBoxes:

<ListBox x:Name="ListBox1" 
     Margin="0,0,-12,0" 
     ItemsSource="{Binding Categories}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Margin="0,0,0,17" 
        Width="432"> 
     <TextBlock Text="{Binding CategoryName}" 
        TextWrapping="Wrap" 
        Margin="12,0,0,0" 
        Style="{StaticResource PhoneTextExtraLargeStyle}" /> 
     </StackPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

L'autre est identique, à l'exception « Catégories » est remplacé par « Entrées » et « CategoryName » par « NomEntrée ».

Merci d'avance pour votre aide.

Répondre

1

Bien que l'action que vous effectuez ne provoque pas d'erreurs dans votre application, il y aura un impact sur le périphérique dans son ensemble pendant que l'infrastructure Silverlight gère les erreurs de liaison. Plutôt que d'avoir deux modèles de données différents et de les changer, pourquoi ne pas avoir un seul modèle qui contient les modèles "Categories" et "Entries", mais il suffit de définir celui que vous n'affichez pas comme une collection vide (ou quelque chose d'autre?). le cas échéant). Cela permettrait aux liaisons de fonctionner mais empêcherait la population des zones de liste que vous n'affichez pas.

+0

C'est une bonne idée. Je suis curieux de savoir s'il s'agit d'un comportement connu, à savoir que l'on tente de charger des liaisons d'éléments d'interface utilisateur actuellement inactifs? – Praetorian

+0

@Praetorian Je m'attendrais à ce que toutes les liaisons soient évaluées en même temps en vue de trouver des problèmes (en soulevant des erreurs de liaison) dès que possible. Il n'est pas prudent de supposer que les liaisons seront mises à jour lorsque l'interface utilisateur changera. Il est beaucoup plus commun (attendu?) Pour un datacontext d'être défini une fois, puis les modifications sont traitées dans le viewmodel. –