为什么可视化树中有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;
                    }

为什么可视化树中有2个ListBoxItems

您所拥有的是不正确的。ListBox将自动包装ListBoxItem实例中的项。在您的情况下,您将在自动为您创建的ListBoxItem中显示一个ListBoxItem(来自DataTemplate)。

您应该使用ItemContainerStyle来设置自动创建的ListBoxItem的属性。