Pergunta

Desculpe - minha pergunta é quase idêntica a Este Mas como não recebeu uma resposta viável, espero que outra pessoa tenha algumas idéias novas.

Eu tenho um WPF TreeView que está ligado a uma hierarquia de um único tipo:

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

A classe de entidade implementa inotifyPropertyChanged, mas eu omiti esse código para maior clareza.

O TreeView está vinculado a uma obserableCollectionu003CEntity> e cada instância da entidade expõe um conjunto de instâncias de entidade contidas por meio de sua propriedade infantil:

<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>

Inicialmente, o TreeView liga como esperado e exibe corretamente uma hierarquia de vários níveis. Além disso, quando a associação de uma das coleções de crianças é programaticamente modificada, as alterações são refletidas corretamente no TreeView.

No entanto, mudanças na associação da observação de nível de membro raizu003CEntity> não são refletidos no TreeView.

Quaisquer sugestões seriam apreciadas.

Obrigado, Tim

Foi útil?

Solução

Meu palpite inicial é que você tem algo como o seguinte para o nó raiz:

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

Então, em vez de fazer algo [bom] como o seguinte:

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

Você está fazendo algo [ruim] assim:

Entities = new ObservableCollection<Entity>(someSetOfItems);

Você deve ser capaz de rastrear o problema, fazendo o campo de apoio da propriedade das entidades readonly:

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

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

Outras dicas

Explicação adicional, muito tempo para a resposta, mas acredito que, se você fizer a ligação no XAML e, em seguida, atribuir um novo objeto à propriedade, você quebra a ligação, para que você precise refazer a ligação no código para ele trabalhar. Daí a solução com o campo de apoio de leitura. Se estiver assim, você não poderá atribuir uma nova ObservableCollection e não quebrará a ligação atribuindo um novo objeto ao campo de apoio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top