WPF ListView UI получить вновь добавленный элемент UI - PullRequest
0 голосов
/ 04 мая 2020

В моем приложении пользователь может динамически добавлять, удалять и редактировать элементы в ListView. Его данные привязаны к коллекции, содержащей объекты пользовательского класса (какие свойства привязаны к GridView-заголовкам ListView для отображения данных).

Теперь мне нужно найти способ получить элемент пользовательского интерфейса ListViewItem объект каждого вновь добавленного или отредактированного элемента для динамического стилизации элемента ListViewItem в коде на основе определенных факторов.

По пути я использую следующий код, который отлично работает, если элемент (как элемент пользовательского интерфейса, так и связанный с ним элемент данных) уже добавлен, поэтому в случае обновления элемента:

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

item в данном случае это объект моего пользовательского класса, который также находится в ListSource ItemsSource. События как в ListView.ItemsSource, так и в самой коллекции вызываются, очевидно, непосредственно после добавления элементов, но пользовательский интерфейс еще не обновлен, например, пока нет объекта ListViewItem, который соответствует вновь добавленному элементу данных, поэтому метод, показанный выше, всегда возвращает null для listItem. listView.ItemContainerGenerator.ItemsChanged - событие выглядит многообещающе, но ItemsChangedEventArgs, похоже, не содержит никакой полезной информации, поэтому я действительно застрял.

Несмотря на то, что очень легко получить доступ к самим данным списков, у меня нет Не нашли способ получить элементы пользовательского интерфейса сразу после их создания и визуального добавления в список. Метод, показанный выше, охватывает только обновление уже существующих элементов.

1 Ответ

1 голос
/ 04 мая 2020

Я не нашел способа получить элементы пользовательского интерфейса сразу после их создания и визуального добавления в список

Это можно сделать, подключив обработчик событий к контейнеры в вашей разметке 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 - переработка

...