2010-04-01 2 views
1

Je ne sais pas pourquoi cela ne fonctionne pas étant donné que je l'ai eu du code de travail, juste ajouté un nouveau niveau de code, mais voici ce que J'ai. Fondamentalement, lorsque je lier le ViewModel à une liste, la liaison se lève lorsque des éléments sont ajoutés à une collection. Toutefois, si une mise à jour se produit sur l'élément lié, elle n'est pas mise à jour. Fondamentalement, j'ai un ObservableCollection qui contient une classe personnalisée avec une valeur de chaîne. Lorsque cette valeur de chaîne est mise à jour, j'en ai besoin pour mettre à jour la liste.Silverlight Binding - Lier quand l'article est ajouté, mais ne reçoit pas les mises à jour

À l'heure actuelle, lorsque je débogue, l'élément de liste est mis à jour correctement, mais l'interface utilisateur ne reflète pas la modification. Si je place l'élément lié dans une variable membre et l'annule, puis le réinitialiser à la bonne collection cela fonctionnera, mais pas le comportement désiré.

Voici une maquette du code, j'espère que quelqu'un pourra me dire où je me trompe. En outre, j'ai essayé d'implémenter INofityPropertyChanged à chaque niveau dans le code ci-dessous.

public class Class1 
{ 
    public string ItemName; 
} 

public class Class2 
{ 
    private Class2 _items; 

    private Class2() //Singleton 
    { 
      _items = new ObservableCollection<Class1>(); 
    } 

    public ObservableCollection<Class1> Items 
    { 
      get { return _items; } 
      internal set 
      { 
       _items = value; 
      } 
    } 
} 

public class Class3 
{ 

    private Class2 _Class2Instnace; 

    private Class3() 
    { 
      _Class2Instnace = Class2.Instance; 
    } 

    public ObservableCollection<Class1> Items2 
    { 
      get {return _Class2Instnace.Items; } 
    } 
} 

public class MyViewModel : INofityPropertyChanged 
{ 
    private Class3 _myClass3; 

    private MyViewModel() 
    { 
      _myClass3 = new Class3(); 
    } 

    private BindingItems 
    { 
      get { return _myClass3.Items2; } // Binds when adding items but not when a Class1.ItemName gets updated. 
    } 
} 
+0

Je peux voir une tentative à un motif Singleton ici, mais le code effectivement publié est un peu foiré. Il n'y a pas d'instance statique de 'Class2' ni de propriété statique' Instance'. Ce n'est pas important, c'est sans rapport avec votre problème. – AnthonyWJones

+0

Oui, le singleton fonctionne, je n'avais pas envie de tout taper. Si je disais que c'était un singleton, on supposerait que le reste du code était là. Je ne pense pas que cela ait quelque chose à voir avec le problème. –

+0

@dw: Pour référence future, il est généralement préférable d'afficher un code court mais complet ou d'inclure explicitement des commentaires indiquant que les détails d'implémentation sont manquants. Si le problème était moins évident, cela aurait pu être gênant, rendant difficile la réponse correcte. – AnthonyWJones

Répondre

2

La réponse à votre question est que Class1 besoins pour mettre en œuvre INotifyPropertyChanged.

public class Class1 : INotifyPropertyChanged 
{ 
    private string _ItemName; 
    public string ItemName 
    { 
     get { return _ItemName; } 
     set 
     { 
     _ItemName = value; 
     NotifyPropertyChanged("ItemName"); 
     } 
    } 

    private void NotifyPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

} 
+0

Essayé cela et déclaré "Aussi, j'ai essayé d'implémenter INofityPropertyChanged à tous les niveaux dans le code ci-dessous." D'autres idées? –

+0

Prenez cela en arrière, pensé que je l'ai fait, mais je vais réessayer pour m'assurer. –

+0

C'était ça ... Merci d'être mes deuxièmes yeux, de travailler à travers tout le code m'a fait oublier ça. Merci à tous! –

Questions connexes