Добавьте элементы управления для пустых ячеек в Grid, который является ItemsPanelTemplate для ListView - PullRequest
1 голос
/ 08 октября 2010

У меня есть 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 StackOverflow
        element.SetValue(Grid.RowProperty, 1);
    }
}

ПРИМЕЧАНИЕ. Я знаю, что я работаю с DomainObject, но просто потерпите меня, пожалуйста.

Что мне это даст, это сетка с элементами в правильной строке и столбце. Но что, если я хочу отобразить что-то в пустых ячейках, например, какой-нибудь текст типа «ноль»?

Я не могу просто добавить его в свой шаблон, поскольку это приводит к сбою приложения, говоря, что ItemsControl создаст необходимые элементы управления. Я пытался получить доступ к сетке / шаблону в коде позади, но не могу найти, как это сделать. Может быть, я не должен использовать ListView? Может быть есть другие / лучшие решения?

1 Ответ

0 голосов
/ 20 января 2011

То, что я закончил, было:

  • Создайте таблицу со всеми моими ColumnDefinitions и RowDefinitions (я знаю, сколько мне нужно)
  • В коде моего представления я приведу свой DataContext к тому, что, как я знаю, будет
  • Я перебираю коллекцию, и для каждого элемента я создаю новый элемент управления и устанавливаю его DataContext для элемента
  • Затем я устанавливаю RowProperty и ColumnProperty и добавляю этот элемент управления в сетку
  • Я также помню, где я добавил все эти элементы управления, поэтому я могу добавить пустые элементы управления в Grid там, где их еще нет.

Это то, что я думаю, я изменю по причинам производительности: - Вместо перебора всей коллекции элементов переберите все возможные ячейки таблицы, добавьте элемент управления (всегда) и установите DataContext, если имеется соответствующий элемент.

Причиной для этого является производительность. Заполнение сетки занимает около 2 секунд, и я бы хотел, чтобы это было быстрее.

...