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

C# WPF ListView UI获取新添加的UI元素,c#,wpf,listview,listviewitem,C#,Wpf,Listview,Listviewitem,在我的应用程序中,用户可以在ListView中动态添加、删除和编辑元素。它的数据绑定到一个包含自定义类对象的集合,自定义类的属性绑定到ListView的GridView头以显示数据 现在,我需要找到一种方法来获取每个新添加或编辑项的ListViewItem UI元素对象,以便根据某些因素在代码中动态设置ListViewItem的样式 在此过程中,我使用了以下代码,如果已经添加了元素UI元素及其关联的数据元素,那么这些代码可以正常工作,以防元素被更新: var listItem = listVie

在我的应用程序中,用户可以在ListView中动态添加、删除和编辑元素。它的数据绑定到一个包含自定义类对象的集合,自定义类的属性绑定到ListView的GridView头以显示数据

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

在此过程中,我使用了以下代码,如果已经添加了元素UI元素及其关联的数据元素,那么这些代码可以正常工作,以防元素被更新:

var listItem = listView.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem;
if (!isValid)
{
    listItem.Background = Brushes.Red;
    listItem.Foreground = Brushes.Black;
}
本例中的项是自定义类的一个对象,该对象也可以在ListView的ItemsSource中找到。ListView.ItemsSource和集合本身上的事件显然是在添加元素后直接引发的,但UI尚未更新,例如,还没有对应于新添加的数据元素的ListViewItem对象,因此上面显示的方法始终为listItem返回null。 listView.ItemContainerGenerator.ItemsChanged-event看起来很有希望,但是ItemsChangedEventArgs似乎没有包含任何有用的信息,所以我真的被卡住了

虽然获取列表数据本身似乎很容易,但我还没有找到一种方法,在创建UI元素并将其可视化添加到列表中之后立即获取它们。上面显示的方法只包括更新已经存在的元素

我还没有找到一种在UI元素被创建并直观地添加到列表中之后立即获取它们的方法

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

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

注意容器可能会被回收:

您是否考虑过在itemcontainerstyle和/或itemtemplate中使用datatrigger?这将避免由于回收容器而产生的任何问题。据我所知,容器回收是可选的,默认情况下不启用,但如果我错了,请纠正我。在我的例子中,这个列表永远不会太大,所以我认为没有必要使用容器回收进行优化,因此这个问题已经被避免了。如果我没有抓住要点,请一定要开导我。
private void ListViewItem_Loaded(object sender, RoutedEventArgs e)
{
    ListViewItem lvi = (ListViewItem)sender;
    ...
}