2010-01-26 10 views
8

Spiacente: la mia domanda è quasi identica a this one ma poiché non ha ricevuto una risposta valida, spero che qualcun altro abbia delle idee nuove.WPF TreeView associato a ObservableCollection che non aggiorna i nodi root

Ho un TreeView WPF che si associa ad una gerarchia di un singolo tipo:

public class Entity 
{ 
    public string Title { get; set; } 
    public ObservableCollection<Entity> Children { get; set; } 
} 

La classe Entity implementa INotifyPropertyChanged, ma hanno omesso questo codice per chiarezza.

La TreeView è associato a un ObservableCollection < Entity> e ogni istanza Entità espone un insieme di istanze di entità contenute attraverso la proprietà Bambini:

<TreeView ItemsSource="{Binding Path=Entities}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}"> 
      <TextBlock Text="{Binding Path=Title}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

Inizialmente TreeView lega come previsto e visualizza correttamente un multi-livello gerarchia. Inoltre, quando l'appartenenza a uno degli insiemi Children viene modificata a livello di codice, le modifiche si riflettono correttamente in TreeView.

Tuttavia, le modifiche all'appartenenza al livello membro radice ObservableCollection < Entity> non si riflettono in TreeView.

Qualsiasi suggerimento sarebbe apprezzato.

Grazie, Tim

risposta

19

mia ipotesi iniziale è che si ha qualcosa di simile a quanto segue per il nodo principale:

public ObservableCollection<Entity> Entities 
{ 
    get; 
    set; 
} 

Poi, invece di fare qualcosa di [buon] simile al seguente:

Entities.Clear(); 
foreach (var item in someSetOfItems) 
    Entities.Add(item); 

si sta facendo qualcosa [male] in questo modo:

Entities = new ObservableCollection<Entity>(someSetOfItems); 

Dovreste essere in grado di rintracciare il problema rendendo il campo sostegno della proprietà Entità readonly:

private readonly ObservableCollection<Entity> _entities 
    = new ObservableCollection<Entity>(); 

public ObservableCollection<Entity> Entities 
{ 
    get 
    { 
     return _entities; 
    } 
} 
+0

Grazie - una brillante analisi! –

+1

Wow, questo ha funzionato per me. Perché funziona questa modifica? –

+3

@Mike Nell'esempio [Bad] sta creando una nuova entità, rompendo così il legame con l'originale. Nell'esempio [buono] sta solo cancellando e aggiungendo oggetti ma mantenendo la collezione originale. –

2

ulteriori spiegazioni, molto tempo per rispondere a venire, ma credo che se si fa il legame in XAML, e quindi nel codice assegna un nuovo oggetto alla proprietà si interrompe l'associazione, quindi è necessario ripetere l'associazione nel codice affinché funzioni. Da qui la soluzione con il campo di sola lettura. Se fai così non sarai in grado di assegnare una nuova ObservableCollection e non spezzerai l'associazione assegnando un nuovo oggetto al campo di supporto.