2010-10-07 60 views
1

我有一个WPF ListView,其中有一个Grid作为ItemsPanelTemplate。我根据物品的属性在正确的列和行中显示我的物品。但我想在我的网格的空单元格中添加一些控件。将控件添加到GridView的ListPanelTemplate中的空单元格

这是我的代码和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?也许还有其他更好的解决方案?

回答

0

我最终什么事做的是:

  • 让我所有的ColumnDefinitions和RowDefinitions一个网格(我知道我需要多少)
  • 在我查看代码隐藏,我投我的DataContext我知道这将是
  • 我迭代集合,并为每个项目,我创建一个新的控制并将其DataContext设置为项目
  • 然后我设置RowProperty和ColumnProperty并将此控件添加到网格
  • 我还记得我在哪里添加了所有这些控件,因此我可以将空控件添加到尚未有的网格中。

这就是我想我会出于性能方面的改变: - 在项目的集合,而不是迭代的,迭代网格的所有可能的细胞,增加一个控制(总是),并设置在DataContext如果有相应的项目。

做到这一点的原因是性能。需要大约2个时间才能填满网格,我希望它更快。

相关问题