WPF ListBox-获取UIElement而不是SelectedItem

WPF ListBox-获取UIElement而不是SelectedItem,wpf,listbox,datatemplate,selecteditem,uielement,Wpf,Listbox,Datatemplate,Selecteditem,Uielement,我创建了一个ListBox,其中有一个DataTemplate作为itemtplate。但是,是否有一种简单的方法可以访问生成的ui元素,而不是codebehind中的SelectedItem 当我访问SelectedItem时,我只是从我的 ItemsSourcecollection。是否有办法访问ui元素(即 从数据模板和绑定对象一起生成的元素)您正在查找属性。每个ItemsSource都有一个实例。此类具有您可能感兴趣的以下方法: 一旦有了列表框项的句柄,就可以继续浏览逻辑和可视树了。退房

我创建了一个
ListBox
,其中有一个
DataTemplate
作为
itemtplate
。但是,是否有一种简单的方法可以访问生成的
ui元素
,而不是codebehind中的
SelectedItem

当我访问
SelectedItem
时,我只是从我的
ItemsSource
collection。是否有办法访问
ui元素
(即 从
数据模板
和绑定对象一起生成的元素)

您正在查找属性。每个
ItemsSource
都有一个实例。此类具有您可能感兴趣的以下方法:

一旦有了
列表框项的句柄
,就可以继续浏览逻辑和可视树了。退房并离开

正如Andy在评论中所说,仅仅因为物品存在于你的收藏中并不意味着已经为它生成了一个容器。任何类型的虚拟化面板场景都会引发此问题;UIElements将在不同的项目中重用。也要小心。西兹、安迪和博迪克是绝对正确的

下面是我如何使用列表框的句柄检索列表框所选项目的文本框

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();
}
var container=listboxSaveList.ItemContainerGenerator.ContainerFromItem(listboxSaveList.SelectedItem)作为框架元素;
if(容器!=null)
{
ContentPresenter queueListBoxItemCP=VisualTreeWalker.FindVisualChild(容器);
if(queueListBoxItemCP==null)
返回;
DataTemplate DataTemplate=queueListBoxItemCP.ContentTemplate;
textbbox tbxTitle=(TextBox)dataTemplate.FindName(“tbxTitle”,queueListBoxItemCP);
tbxTitle.Focus();
}

(注意:这里,VisualTreeWalker是我自己在VisualTreeHelper上的包装器,公开了各种有用的函数)

注意,仅仅因为控件中添加了一个项,并不意味着它的UI容器已经生成。请确保考虑到还没有UI容器的情况。我正在使用c#和WPF编写,并且此属性未显示在ListBox下。ItemsContainer如何获取此ListBox的实例?@size,您有解决我问题的方法吗?(+250赏金)这里是我工作的完整代码,仅供参考:
var container=ListBox.ItemContainerGenerator.ContainerFromItem(ListBox.SelectedItem)作为FrameworkElement;if(container!=null)container.Focus()