Pergunta

Eu criei um ListBox que tem um DataTemplate como Itemtemplate. No entanto, há uma maneira fácil de acessar o UIElement gerado em vez do SelectedItem em codebehind?

Quando eu acessar SelectedItem, eu só pegar o objeto selecionado da minha coleção ItemsSource. Existe uma maneira de acessar o UIElement (ie. A elemento gerado a partir do DataTemplate juntamente com o objeto ligado)?

Foi útil?

Solução

Você está procurando o ItemContainerGenerator propriedade. Cada ItemsSource tem uma href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.itemcontainergenerator" rel="nofollow noreferrer"> ItemContainerGenerator exemplo ContainerFromItem (instância de objecto) .

Uma vez que você tem uma alça para o ListBoxItem, você pode ir em frente e procurar a árvore lógica e visual. Confira Logical Helper Árvore e Visual Helper Árvore .

Como Andy disse nos comentários, só porque o item existe em sua coleção não significa um recipiente foi gerado por ele. Qualquer tipo de virtualização cenário painel irá levantar esta questão; UIElements serão reutilizados em diferentes itens. Tenha cuidado com isso também.

Outras dicas

siz , Andy e Bodeaker está absolutamente certo.

Aqui está como eu era capaz de recuperar a caixa de texto do item selecionado da caixa de listagem utilizando a sua alça.

var container = listboxSaveList.ItemContainerGenerator.ContainerFromItem(listboxSaveList.SelectedItem) as FrameworkElement;
if (container != null)
{
    ContentPresenter queueListBoxItemCP = VisualTreeWalker.FindVisualChild<ContentPresenter>(container);
    if (queueListBoxItemCP == null)
        return;

    DataTemplate dataTemplate = queueListBoxItemCP.ContentTemplate;

    TextBox tbxTitle = (TextBox)dataTemplate.FindName("tbxTitle", queueListBoxItemCP);
    tbxTitle.Focus();
}

(Nota: Aqui, VisualTreeWalker é o meu próprio wrapper sobre VisualTreeHelper com várias funções úteis expostas)

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