Domanda

Siamo spiacenti - la mia domanda è quasi identica a questo ma dal momento che non ha ricevuto una risposta valida, spero che qualcun altro ha alcune idee nuove.

Ho un TreeView WPF che è destinata a una gerarchia di un solo tipo:

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

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

La TreeView è associato a un ObservableCollection e ogni istanza Entità espone una serie di istanze di entità contenuta tramite la sua 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 il TreeView si lega come previsto e visualizza una gerarchia multi-livello in modo corretto. Inoltre, quando l'appartenenza a una delle collezioni per bambini è a livello di codice modificato, le modifiche vengono correttamente nel controllo TreeView.

Tuttavia, variazione dei membri del ObservableCollection livello membro principale non sono riportate nella TreeView.

Tutti i suggerimenti sarebbero apprezzati.

Grazie, Tim

È stato utile?

Soluzione

La mia ipotesi iniziale è che si ha qualcosa di simile al seguente per il nodo radice:

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

Poi, invece di fare qualcosa di [buon] come il seguente:

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

Si sta facendo qualcosa di [male] in questo modo:

Entities = new ObservableCollection<Entity>(someSetOfItems);

Si dovrebbe essere in grado di rintracciare il problema rendendo il campo sostegno del readonly Entità immobile:

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

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

Altri suggerimenti

Ulteriori spiegazioni, molto tempo per la risposta a venire, ma credo che se si fa il legame in XAML, e poi nel codice assegnare un nuovo oggetto per la proprietà si rompe il legame, in modo che avrebbe dovuto rifare l'associazione in il codice per farlo funzionare. Quindi la soluzione con il campo di supporto di sola lettura. Se facendo così non sarà in grado di assegnare un nuovo ObservableCollection e non si romperà il legame assegnando un nuovo oggetto al campo supporto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top