Pergunta

Este é bastante complexo, espero que eu possa deixar isso claro o suficiente para alguém me ajudar. Eu tenho um objeto que vamos chamá -lo de gerente, o gerente tem uma coleção de pessoas que ele gerencia, todas as pessoas implementam Ipson, mas diferentes tipos de pessoas têm propriedades diferentes. Quero exibir esse gerente em uma árvore e, sob o nó do gerente, quero mostrar todos os projetos que ele está gerenciando, que podem ser determinados a partir das pessoas que ele gerencia.

Portanto, o plano é usar um conversor para converter uma pessoa em uma lista de projetos. Aqui está o xaml:

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}">
   <TextBlock Text="{Binding Path=Name}"/>
    <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
                    <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding Path="People">
            <Binding.Converter>
                <configUtil:ProjectListConverter/>
            </Binding.Converter>
        </Binding>
    </HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>

Minha classe de pessoa implementa o InotifyPropertyChanged, e a lista que mantém as pessoas implementa o InotifyCollectionChanged.

No entanto, quando adiciono uma nova pessoa à lista de pessoas, o TreeView não é atualizado. Quando depuro, posso ver que o CollectionChanged está disparando com a ação Adicionar e o item adicionado. Além disso, o evento da coleção não é nulo, então eu sei que a interface do usuário está assistindo. Mas o conversor não é executado quando o item é adicionado.

Aqui está o método Add para a lista que mantém os objetos IPerson:

public void Add(T item)
{
    list.Add(item);
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}

Estou de alguma forma quebrando o banco de dados?

Que outras coisas posso verificar?

O conversor analisa cada item na lista de pessoas e descobre em quais projetos eles estão trabalhando e adiciona o nome do projeto a uma lista de saída.

Foi útil?

Solução

O conversor é aplicado à propriedade que armazena a coleção. Portanto, ele só será chamado se a própria instância da coleta mudar (não se os itens da coleção forem alterados). Uma maneira de contornar isso seria invalidar a coleção quando você deseja que ela seja atualizada.

A maneira mais simples de invalidar a propriedade da coleção e fazer com que o código do conversor seja executado novamente seria null fora da coleção e reatribua -a. Outra maneira é obter o BindingExpression (através da BindingOperations) e ligue UpdateTarget. Finalmente, você pode se ligar a um CollectionView (ou subclasse dela) e ligue Refresh nele.

E se você verdade deseja corrigir o problema de maneira limpa, você pode se ligar à sua própria implementação de ICollectionView que faz a filtragem e aumenta os eventos conforme necessário.

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