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

问题描述 投票:0回答:1

在我的应用程序中,用户可以动态地添加、删除和编辑一个ListView中的元素,它的数据被绑定到一个包含自定义类的对象的集合上(这些对象的属性被绑定到ListView的GridView-Headers上以显示数据)。它的数据被绑定到一个包含自定义类对象的集合上(这些属性被绑定到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 在这种情况下,是我自定义类的一个对象,也可以在ListView的ItemsSource中找到。ListView.ItemsSource和集合本身的事件显然是在元素被添加后直接引发的,但UI还没有更新,比如还没有ListViewItem对象对应新添加的数据元素,所以上图所示的方法总是会返回到 null 对于 listItem. listView.ItemContainerGenerator.ItemsChanged-活动看起来很有希望,但 ItemsChangedEventArgs 似乎不包含任何有用的信息,所以我真的被卡住了。

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

c# wpf listview listviewitem
1个回答
1
投票

我还没有找到一种方法可以在UI元素被创建并添加到列表中后立即获得它们。

你可以通过在你的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.comen-usdotnetframeworkwpfadvancedoptimizing-performance-controls#container-recycling。

© www.soinside.com 2019 - 2024. All rights reserved.