Добавьте элементы управления для пустых ячеек в Grid, который является ItemsPanelTemplate для ListView
У меня есть WPF ListView, который имеет Grid в качестве ItemsPanelTemplate. Я отображаю свои элементы в правильном столбце и строке, основываясь на свойстве элемента. Но я хотел бы поместить некоторые элементы управления в пустые ячейки моей сетки.
Это упрощенная версия моего кода и xaml:
В ресурсах:
<ItemsPanelTemplate x:Key="TheTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
В xaml:
<Controls:CustomListView ItemsSource="{Binding TheCollection}"
ItemsPanel="{DynamicResource TheTemplate}">
</Controls:CustomListView>
Наконец, в моем CustomListView:
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var viewModel = item as DomainObject;
if (viewModel != null)
{
element.SetValue(Grid.ColumnProperty, 1); //here I work with a converter, but this just simplifies it for Stackru
element.SetValue(Grid.RowProperty, 1);
}
}
ПРИМЕЧАНИЕ. Я знаю, что я работаю с DomainObject, но просто потерпите меня, пожалуйста.
Это даст мне сетку с элементами в правильной строке и столбце. Но что, если я хочу отобразить что-то в пустых ячейках, например, какой-нибудь текст типа "ноль"?
Я не могу просто добавить его в свой шаблон, потому что это приводит к сбою приложения, говоря, что ItemsControl создаст необходимые элементы управления. Я пытался получить доступ к сетке / шаблону в коде позади, но не могу найти, как это сделать. Может быть, я не должен использовать ListView? Может быть есть другие / лучшие решения?
1 ответ
Я закончил тем, что сделал:
- Создайте таблицу со всеми моими ColumnDefinitions и RowDefinitions (я знаю, сколько мне нужно)
- В коде моего представления я приведу свой DataContext к тому, что, как я знаю, будет
- Я перебираю коллекцию и для каждого элемента создаю новый элемент управления и устанавливаю его DataContext для элемента
- Затем я устанавливаю RowProperty и ColumnProperty и добавляю этот элемент управления в сетку.
- Я также помню, где я добавил все эти элементы управления, поэтому я могу добавить пустые элементы управления в Grid там, где их еще нет.
Это то, что я думаю изменить из соображений производительности: - Вместо итерации по коллекции элементов, итерации по всем возможным ячейкам таблицы, добавьте элемент управления (всегда) и установите DataContext, если есть соответствующий элемент.
Причиной этого является производительность. Заполнение сетки занимает около 2 секунд, и я бы хотел, чтобы это было быстрее.