【发布时间】:2020-02-25 10:14:57
【问题描述】:
我有以下数据网格:
<DataGrid Grid.Row="2" ItemsSource="{Binding Rejects}" AutoGenerateColumns="False" Style="{StaticResource DataGridStyle}" ColumnHeaderStyle="{StaticResource DataGridHeaderStyle}">
<DataGrid.Columns>
<DataGridTextColumn Header="First column" Binding="{Binding Id}"/>
</DataGrid.Columns>
</DataGrid>
ItemsSource 绑定到我的 ViewModel 的一个名为 Rejects 的属性,它是 Dummy 对象的 ObservableCollection。
这里是名为 DataGridHeaderStyle 的样式:
<Style x:Key="DataGridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Height" Value="30"/>
<Setter Property="Background" Value="{StaticResource EasternBlueBrush}"/>
<Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/>
<Setter Property="BorderBrush" Value="{StaticResource DarkGreyBrush}"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10 0"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridColumnHeader">
<ControlTemplate.Resources>
<converters:DebugConverter x:Key="DebugConverter"/>
</ControlTemplate.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Background="{TemplateBinding Background}" Padding="5">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock x:Name="SortArrow" Margin="0 0 5 0"/>
<ContentPresenter Content="{Binding}"/>
</StackPanel>
</Border>
<Thumb x:Name="PART_RightHeaderGripper" Grid.Column="1"
HorizontalAlignment="Right"
Width="2"
BorderThickness="1"
BorderBrush="{StaticResource EasternBlueBrush}"
Cursor="SizeWE"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ToolTip" Value="Click to sort."/>
<Setter Property="Background" Value="{StaticResource CuriousBlueBrush}"/>
</Trigger>
<Trigger Property="SortDirection" Value="Ascending">
<Setter TargetName="SortArrow" Property="Visibility" Value="Visible"/>
<Setter TargetName="SortArrow" Property="Text" Value="↓"/>
</Trigger>
<Trigger Property="SortDirection" Value="Descending">
<Setter TargetName="SortArrow" Property="Visibility" Value="Visible"/>
<Setter TargetName="SortArrow" Property="Text" Value="↑"/>
</Trigger>
<Trigger Property="SortDirection" Value="{x:Null}">
<Setter TargetName="SortArrow" Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我原本希望只有一个名为“第一列”的列,但结果如下: Result
如您所见,出现了另一个名为我的 ViewModel 名称的列。当我删除 Template 属性时,这不会发生。 此外,虽然这个新列看起来像另一列,但它在悬停时没有反应。
编辑
正如我在@ketan 的回答下所说,我可以通过将 DataGrid 的 DataContext 设置为 {x:Null} 并直接从代码隐藏中设置 ItemsSource 来删除奇怪的列标题,这表明问题链接到 DataGrid 的 DataContext,但我仍然需要保留它,知道吗?
另外,这是我用作 ItemsSource 的列表:
public ObservableCollection<Dummy> Rejects { get; set; } = new ObservableCollection<Dummy>()
{
new Dummy()
{
Id = 1,
Prop1 = "A"
},
new Dummy()
{
Id = 2,
Prop1 = "B"
}
};
解决方案
我终于发现出了什么问题。它都链接到模板内我的 ContentPresenter 的 Content 属性:我设置了 Content 属性而不是 ContentSource。因此,解决方案是:
<ContentPresenter ContentSource="Header"/>
【问题讨论】:
-
设置数据网格 AutoGenerateColumns = false
-
@ketan 已经设置为 false
-
请不要应用样式,然后检查输出
-
@ketan 如果我不这样做,错误不会发生,它链接到我的样式的模板属性
标签: wpf mvvm .net-core datagrid