WPF TreeView ligado ao ObservableCollection não atualizando os nós da raiz
-
22-09-2019 - |
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
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.