2010-10-07 65 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個時間才能填滿網格,我希望它更快。

相關問題