0

Hi have a very simple WPF DataGrid layout as follows:

<wpftk:DataGrid Grid.Row="1"
        x:Name="myOrdersGrid"
        ColumnHeaderStyle="{DynamicResource FilterColumnHeaderStyle}"
        CanUserResizeColumns="True"
        VerticalAlignment="Stretch"
        HorizontalAlignment="Stretch">

  <wpftk:DataGrid.Resources>
    <Style x:Key="FilterColumnHeaderStyle" TargetType="{x:Type Primitives:DataGridColumnHeader}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type Primitives:DataGridColumnHeader}">
            <WrapPanel Width="50" Orientation="Vertical">
              <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Stretch"  />
              <TextBox Text="Hello" FontSize="10" Background="OldLace" HorizontalAlignment="Center" />
            </WrapPanel >
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </wpftk:DataGrid.Resources>

  <wpftk:DataGrid.Columns>
    <wpftk:DataGridTextColumn SortMemberPath="Name" Binding="{Binding Name}" IsReadOnly="True"/>
    <wpftk:DataGridTextColumn SortMemberPath="Name" Binding="{Binding Price}" IsReadOnly="True"/>
  </wpftk:DataGrid.Columns>
</wpftk:DataGrid>

The intention is to drop a textbox into each header, in order to act as a filter.

However, when this renders, I get an extra textbox floating halfway across the datagrid, as follows:

DataGrid with extra column

Anyone know why? I've played around with all sorts of settings etc, but can't figure out why this is happening (let alone how to fix it....). The extra textbox doesn't seem to be enabled/clickable so it looks like it's some sort of disabled/glasspaned scenario.

4

2 に答える 2

1

オフAutoGenerateColumnsにします。2 つの宣言型の列に加えて、バインド先のデータ項目に含まれる列があればList<string>、3 番目の列を取得します (DataGridColumnHeaderテンプレートを定義したので、3 番目の列で使用されます)。列も同様です)。

(注:投稿されたコードを編集して削除しましたAutoGenerateColumnsか?最初に見たときにそこにあったと確信しています)。

于 2012-09-24T12:01:44.273 に答える
0

さて、私は問題を見つけました。追加のコントロールは、データグリッドが最後に定義された列とデータグリッドの RHS の間に自動的に挿入する「フィラー」列に配置されているようです。

これを行うためのより良い方法は、次のようにヘッダー コントロールに ContentTemplate を使用することです。

<Style x:Key="FilterColumnHeaderStyle" TargetType="{x:Type Primitives:DataGridColumnHeader}">
      <Setter Property="ContentTemplate">
        <Setter.Value>
          <DataTemplate>
            <WrapPanel Orientation="Vertical">
              <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Stretch"  />
              <TextBox Text="{grid:GridFilter UpdateSourceTrigger=PropertyChanged}"
                  Visibility="{Binding ElementName=FilterCheckbox, Path=IsChecked, Converter={StaticResource b2v}}"
                  FontSize="10" Width="50" Background="OldLace" HorizontalAlignment="Center" />
            </WrapPanel >
          </DataTemplate>
        </Setter.Value>
      </Setter>
    </Style>

これは、カスタマイズされたヘッダーがグリッドからの正しいスタイルを保持し、XAML で明示的に宣言する必要なく、サムなどを含めることを意味します。

ただし、データグリッドの余分な列がバグであるかどうかを知りたい (テンプレート化の目的で) - .Net 4 で修正されたことを示す記事を読みました。

于 2012-09-25T14:57:03.907 に答える