2013-09-04 3 views
0

J'essaie de comprendre comment créer une nouvelle instance d'un objet sans rompre les liaisons XAML. En ce moment, tout ce que je travaille est un ObservableCollection que je vais appeler:Liaison à une nouvelle instance d'un objet

Container.MyClass.MyCollection 

Dans mon ViewModel (avec INPC mis en œuvre par Kind of Magic):

public ObservableCollection<MyObject> Collection 
{ 
    get { return Container.MyClass.MyCollection; } 
} 

À mon avis:

<StackPanel> 
    <TextBlock Text="{Binding Collection.Count}" /> 
    <ItemsControl ItemsSource="{Binding Collection}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Columns="1" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Content="{Binding Name}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</StackPanel> 

donc, si je tente d'obtenir une instance « frais » de ma classe, je peux appeler cela et avoir les liaisons restent intactes:

public void WorkingSomewhatFreshInstance() 
{ 
    Container.MyClass.MyCollection.Clear(); 

    Container.MyClass.MyCollection.Add(new MyObject() { Name = "Test1" }); 
    Container.MyClass.MyCollection.Add(new MyObject() { Name = "Test2" }); 
} 

Cependant, si j'appelle cette méthode:

public MyClass BrokenFreshInstance() 
{ 
    var myClass = new MyClass(); 

    myClass.MyCollection.Add(new MyObject() { Name = "Test1" }); 
    myClass.MyCollection.Add(new MyObject() { Name = "Test2" }); 

    return myClass; 
} 

puis:

Container.MyClass = Initialize.BrokenFreshInstance(); 

Les liaisons plus aucune mise à jour. Est-il possible d'utiliser une nouvelle instance d'un objet et que les liaisons XAML restent intactes?

Répondre

1

Vous pouvez dire la vue d'actualiser la liaison à la nouvelle instance en appelant le PropertyChanged sur le Observable:

public ObservableCollection<MyObject> Collection 
{ 
    get { return _collection; } 
    set 
    { 
     _collection = value; 
     RaisePropertyChangedEvent("Collection"); 
    } 
} 

Vous devrez attribuer les collections à cette propriété pour déclencher l'événement:

Collection = Container.MyClass.MyCollection; //This will trigger the PropertyChangedEvent 
... 
Container.MyClass = Initialize.BrokenFreshInstance(); 
Collection = Container.MyClass.MyCollection; // Trigger again.. 

Ou vous pouvez augmenter le changement manuellement en faisant:

Container.MyClass = Initialize.BrokenFreshInstance(); 
RaisePropertyChangedEvent("Collection"); 
+0

Votre première solution a fonctionné. Cependant, puisque j'utilise Kind of Magic, je n'avais même pas besoin d'appeler manuellement 'RaisePropertyChanged'; Je devais juste assigner un champ et un setter. Y a-t-il un moyen de contourner cela et de toujours pouvoir retourner la valeur du getter? De toute façon, j'apprécie votre aide! –

+0

En outre, la propriété est dans un ViewModel différent de la commande, donc je ne pense pas que votre deuxième réponse fonctionnera pour moi. –

+0

Grattez que, une fois la valeur attribuée manuellement, les propriétés automatiques fonctionnent correctement. Merci de votre aide! –

0

Vous devez déclencher un événement PropertyChanged pour Collection si l'instance renvoyée par la propriété change.

Questions connexes