1

我有一个 WPF ListView,它有一个网格作为 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,但请耐心等待。

这将给我的是一个网格,其中包含正确的行和列中的项目。但是如果我想在空单元格中显示一些东西,例如一些像'null'这样的文本呢?

我不能只是将它添加到我的模板中,因为这会使应用程序崩溃,并说 ItemsControl 将创建必要的控件。我尝试在代码隐藏中访问网格/模板,但找不到如何访问。也许我不应该使用 ListView?也许还有其他/更好的解决方案?

4

1 回答 1

0

我最终做的是:

  • 用我所有的 ColumnDefinitions 和 RowDefinitions 创建一个网格(我知道我需要多少)
  • 在 View 的代码隐藏中,我将 DataContext 转换为我知道的内容
  • 我遍历集合,并为每个项目创建一个新控件并将其 DataContext 设置为项目
  • 然后我设置 RowProperty 和 ColumnProperty 并将这个控件添加到 Grid
  • 我还记得我在哪里添加了所有这些控件,因此我可以将空控件添加到还没有的网格中。

这就是我认为出于性能原因我将更改的内容: - 不是迭代项目集合,而是迭代网格的所有可能单元格,添加一个控件(总是),如果有相应的项目,则设置 DataContext。

这样做的原因是性能。填充网格大约需要 2 秒,我希望它更快。

于 2011-01-20T15:14:16.997 回答