WPF ListView UI 获取新添加的 UI 元素

WPF ListView UI get newly added UI element

在我的应用程序中,用户可以动态地添加、删除和编辑 ListView 中的元素。它的数据绑定到包含自定义对象的集合 class(哪些属性绑定到 ListView 的 GridView-Headers 以显示数据)。

现在我需要找到一种方法来获取每个新添加或编辑的项目的 ListViewItem UI 元素对象,以便根据某些因素在代码后面动态设置 ListViewItem 的样式。

在我使用以下代码的过程中,如果已经添加了元素(UI 元素及其关联的数据元素),则该代码工作正常,因此万一更新了元素:

var listItem = listView.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem;
if (!isValid)
{
    listItem.Background = Brushes.Red;
    listItem.Foreground = Brushes.Black;
}

item 在这种情况下是我的自定义 class 的一个对象,它也可以在 ListView 的 ItemsSource 中找到。 ListView.ItemsSource 和集合本身的事件显然是在添加元素后直接引发的,但 UI 尚未更新,例如还没有与新添加的数据元素相对应的 ListViewItem 对象,因此上面显示的方法总是 returns null for listItemlistView.ItemContainerGenerator.ItemsChanged-事件看起来很有希望,但是ItemsChangedEventArgs似乎没有包含任何有用的信息,所以我真的卡住了。

虽然获取列表数据本身似乎很容易,但我还没有找到在 UI 元素创建并可视化添加到列表后立即获取这些元素的方法。上面显示的方法,只涉及更新已经存在的元素。

I haven't found a way to get the UI elements right after they have been created and visually added to the list

您可以通过将事件处理程序挂接到 XAML 标记中的容器来实现:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="Loaded" Handler="ListViewItem_Loaded" />
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

private void ListViewItem_Loaded(object sender, RoutedEventArgs e)
{
    ListViewItem lvi = (ListViewItem)sender;
    ...
}

注意容器可能会被回收:https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-controls#container-recycling