我有一个 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?也许还有其他/更好的解决方案?