为什么可视化树中有2个ListBoxItems
本文关键字:2个 ListBoxItems 可视化 为什么 | 更新日期: 2023-09-27 17:57:35
我只显示ListBox的选定元素(是的,我知道)。。。我试图理解为什么如果我有一个ListBox.ItemTemplate和ListBoxItem的一个子项,我必须遍历2个ListBoxItems才能访问名为"thisListBoxItem"的元素?似乎应该只有一个可视的ListBoxItem元素。
我的XAML
<ListBox Name="cjisDisplayItemListBox" SelectionChanged="cjisDisplayItemListBox_SelectionChanged_1">
<ListBox.ItemTemplate >
<DataTemplate>
<ListBoxItem Name="thisListBoxItem" Visibility="Collapsed">
<!-- some TextBlocks with bindings here -->
</ListBoxItem>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
//首先,我将SelectedItem强制转换为ListBoxItem(myListBoxItem)//那么我必须通过FindName属性下降到较低的ListBoxItem。。
private void cjisDisplayItemListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
ListBox lb = sender as ListBox;
object item = lb.SelectedItem as object;
ListBoxItem myListBoxItem = (ListBoxItem)(lb.ItemContainerGenerator.ContainerFromItem(item));
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);
if (myContentPresenter == null) return;
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
ListBoxItem temp = (ListBoxItem)myDataTemplate.FindName("thisListBoxItem", myContentPresenter);
if (myListBoxItem.IsSelected) temp.Visibility = System.Windows.Visibility.Visible;
}
您所拥有的是不正确的。ListBox将自动包装ListBoxItem实例中的项。在您的情况下,您将在自动为您创建的ListBoxItem中显示一个ListBoxItem(来自DataTemplate)。
您应该使用ItemContainerStyle来设置自动创建的ListBoxItem的属性。