【问题标题】:Solved - Setting DataGridColumnHeader template with predefined columns adds too much columns已解决 - 使用预定义列设置 DataGridColumnHeader 模板会添加太多列
【发布时间】: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="&#8595;"/>
                        </Trigger>
                        <Trigger Property="SortDirection" Value="Descending">
                            <Setter TargetName="SortArrow" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="SortArrow" Property="Text" Value="&#8593;"/>
                        </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


【解决方案1】:
<DataGrid Grid.Row="2" x:Name="gridDemo" ItemsSource="{Binding lst}" AutoGenerateColumns="False" Loaded="gridDemo_Loaded_1" >
            <DataGrid.Columns>
                <DataGridTextColumn Width="*" Header="First column" Binding="{Binding id}"/>
            </DataGrid.Columns>
        </DataGrid>

将列宽传递给*

【讨论】:

  • 它有效,但我还必须从我的窗口中完全删除我的视图模型的任何引用,这是我不想要的。我还尝试将我的 DataGrid 的 DataContext 设置为 {x:Null} 并且效果很好,但我不明白为什么我必须这样做
  • 如果我没有应用你的风格,上面的代码可以完美运行
  • 您确定已将Width="*" 添加到第一列吗?
  • 发布您的项目源代码拒绝。将调试器放在您通过拒绝数据验证两次的 itemsource 上,我认为有 viewmodel 会添加额外的列,所以请检查您传递给 Grid 的列表项。您的结果表明默认添加了合规性paypal 视图模型
  • 我用我的列表代码编辑了我的初始帖子。此外,虽然它使用代码隐藏工作,但我对此并不满意,并希望将我的 ViewModel 与绑定一起使用,因此我无法调试此
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2016-02-26
  • 2018-08-03
  • 1970-01-01
  • 2019-07-20
  • 2012-03-05
  • 2014-04-01
相关资源
最近更新 更多