Pergunta

Eu quero ser capaz de percorrer a árvore ui visuais procurando um elemento com um ID obrigado a propriedade Tag do elemento visual.

Eu estou querendo saber como eu faço isso. Os controlos não ter filhos para atravessar.

Eu comecei usando LogicalTreeHelper.GetChildren, que parece funcionar como pretendido, até eu bati um controle TreeView ... então LogicalTreeHelper.GetChildren does not devolver quaisquer crianças.

Nota: o objetivo é encontrar o elemento UI visual que corresponde ao item de dados. Isto é, dado um ID do item, Go encontrar o elemento UI exibi-lo.

Edit: Estou aparentemente não estou explicando isso bastante bem. Estou vinculativo alguns objetos de dados a um controle TreeView e depois querer selecionar um item específico programaticly dado que o objeto de negócios ID. Eu não vejo por que é tão difícil de travers a árvore visual e encontrar o elemento que eu quero, como ID do objeto de dados é na propriedade Tag do elemento visual apropriado. Estou usando Mole e eu sou capaz de encontrar o elemento de interface do usuário com o ID apropriado nele é Tag. Eu simplesmente não consigo encontrar o elemento visual em código. não LogicalTreeHelper não atravessar nenhum item na árvore. Nem ItemContainerGenerator.ContainerFromItem recuperar qualquer coisa para itens na exibição de árvore.

Nenhuma solução correta

Outras dicas

Dê uma olhada a este amostra . Eu encontrei esta amostra muito bem escrito e eu acredito que o uso view-modelo vai resolver o seu problema.

Editar: E sobre a busca da árvore visual. Ambos TreeView e TreeViewItem tem Items propriedade que você pode percorrer e procurar o seu Id. você não pode usá-lo?

O problema é que apenas o TreeViewItems que são visíveis foram criadas -. WPF não criar todos os itens na frente (devido ao período de tempo que pode demorar para grandes árvores, eu imagino)

Uma abordagem melhor seria a criação de uma estrutura de dados que imita a estrutura de seus dados da árvore, e os dados de uso obrigatório para contar a TreeView como exibir esses dados. Eu posso escrever um exemplo simples, se você gostaria.

EDIT: Com base na sua edição, que irá funcionar apenas se o item UI foi criado para esse objeto, o que não é garantido. Dê uma olhada na IItemContainerGenerator de interface ( recuperadas chamando ItemsControl.ItemContainerGenerator . acredito que tem um método que irá retornar o recipiente UI (ou seja TreeViewItem) para um dado objeto de dados. isso só funcionará se o recipiente UI foi criado anteriormente.

LogicalTreeHelper.GetChildren olha propriedade LogicalChildren do controle, que é nulo por padrão para um TreeView (derivada da classe ItemsControl). Você pode ter que inspecionar o tipo dos objetos retornados por GetChildren e quando você vem a um objeto TreeView, em seguida, fazer alguma lógica de processamento especial.

Essa lógica especial provavelmente será iteração sobre os itens da árvore e tentar lançá-los a um FrameworkElement (a classe base que define propriedade Tag).

Eu tenho feito coisas semelhantes por recursão através da árvore visual usando VisualTreeHelper. Confira este post escrita por Jim Baltzell-Gauthier - ele fornece alguns métodos auxiliares para percorrer a árvore visual e retornar um elemento por nome e tipo, este é semelhante ao código que estou usando no meu projeto atual. Você pode modificar estas funções para tê-lo verificar valores de tags em vez de ou em adição ao nome.

Uma coisa a estar ciente de com o Visual Árvore é que ele não está lá, a menos que os visuais foram carregados - pode ser necessário anexar um delegado à "Loaded" caso de seu elemento visual se o visual não tem sido ainda prestados no ponto em que você chamar o código.

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