首页 > 解决方案 > 如果项目已分组,ItemContainerGenerator.ContainerFromItem 方法返回 null

问题描述

在 WPF ListBox 中,我可以使用ItemContainerGenerator.ContainerFromItem(selectedItem)方法获取所选项目容器,但在 ListBoxItem 分组时它不起作用。

主窗口.xaml

<ListBox x:Name="listBox" ItemsSource="{Binding Contacts}" Loaded="cardView1_Loaded" SelectedIndex="0" Width="250" Height="250"
             HorizontalAlignment="Center" VerticalAlignment="Center">
        <ListBox.GroupStyle>
            <GroupStyle/>
        </ListBox.GroupStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <TextBlock Text="{Binding Age}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

主窗口.xaml.cs

在加载的方法中,首先我调用了这个方法 ItemContainerGenerator.ContainerFromItem(selectedItem) 并且它返回所选项目的容器,因为 Listbox 项目没有分组。然后我为列表框项目添加了分组。现在,如果我调用此方法,它会返回 null。

 public MainWindow()
    {
        InitializeComponent();

        DataContext = new ViewModel();
    }

    private void cardView1_Loaded(object sender, RoutedEventArgs e)
    {
        withOutGroup.Text = withOutGroup.Text + listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem);
        ICollectionView collectionView = CollectionViewSource.GetDefaultView(listBox.ItemsSource);
        collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Name"));
        withGroup.Text = withGroup.Text + listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem);
    }

在此处输入图像描述

示例: ListBox-Testing-Project

如果 Listbox 项已分组,如何获取选定项容器?

标签: wpflistboxitemscontrollistboxitem

解决方案


您需要等待调用该ContainerFromItem方法,直到实际创建容器。这有效:

private void cardView1_Loaded(object sender, RoutedEventArgs e)
{
    ICollectionView collectionView = CollectionViewSource.GetDefaultView(listBox.ItemsSource);
    collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Name"));

    Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded,
        new Action(() =>
        {
            var container = listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem);
            //...
        }));
}

推荐阅读