在我的应用程序中,用户可以动态地添加、删除和编辑一个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元素被创建并添加到列表中后立即获取它们。上面显示的方法,只涵盖了更新已经存在的元素。
我还没有找到一种方法可以在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;
...
}