1

にバインドされている がありDataGridます。これは、実行時にいくつかのテキスト列といくつかのブール列で埋められます。予想どおり、テキスト列は として表示され、ブール列は として表示されます。今のところ問題ありません。チェックボックス列の列ヘッダーを垂直に表示するようになりました。そこで、次のようなスタイルを定義しました。ItemsSourceSystem.Data.DataTableDataTableDataGridTextColumnDataGridCheckBoxColumn

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Style.Triggers>
        <!--<Trigger Property=??? Value=???>
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="270"/>
                </Setter.Value>
            </Setter>
        </Trigger>-->
    </Style.Triggers>
</Style>

問題は - コードでコメントされているように、他のタイプの列ではなく sのみに適用するために、スタイルにどのような種類のトリガーを使用する必要があるかわかりません。DataGridCheckBoxColumn何か案は?

4

2 に答える 2

1

両方の要件を満たすには:

  • タイミング : ItemSource が設定された後にヘッダーをフリップする
  • Filter : スタイルは CheckBoxColumns にのみ適用する必要があります

Attached Behaviour に頼ることができます:

DataGridColumnsBehavior.cs

public static class DataGridColumnsBehavior
{
    public static readonly DependencyProperty
        FlipHeaderProperty =
            DependencyProperty.RegisterAttached("FlipHeader",
                typeof(bool), typeof(DataGridColumnsBehavior),
                    new PropertyMetadata(FlipHeaderChanged));

    public static bool GetFlipHeader(DependencyObject obj)
    {
        return (bool)obj.GetValue(FlipHeaderProperty);
    }
    public static void SetFlipHeader(DependencyObject obj, bool value)
    {
        obj.SetValue(FlipHeaderProperty, value);
    }

    private static void FlipHeaderChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs args)
    {
        var grid = d as DataGrid;
        var flip = (bool)grid.GetValue(FlipHeaderProperty);
        if (grid == null
         || grid.Columns.Count == 0
         || flip == false) return;

        foreach (var column in grid.Columns)
        {
            if (column.GetType() == typeof(DataGridCheckBoxColumn))
                column.HeaderStyle = 
                    (Style)grid.FindResource("CheckBoxColumnHeaderStyle");
        }
    }
}

XAML

<DataGrid ItemsSource="{Binding Collection}" 
          funk:DataGridColumnsBehavior.FlipHeader="{Binding Flip}">
    <DataGrid.Resources>
        <Style x:Key="CheckBoxColumnHeaderStyle" 
               TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="270"/>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>
</DataGrid>

タイミングは、Flip プロパティによって制御されます。コレクションが変更されるたびに、Flip を false に設定してから、再度 true に設定します。列が繰り返され、DataGridCheckBoxColumns のヘッダーが反転されます。これが実装されている方法に注意してください Flip を false に設定しても何も起こらないため、ヘッダーは反転されません。

編集

AutoGeneratingColumn イベントを使用して、より短い方法について学びました。

<DataGrid ItemsSource="{Binding Collection}" 
          AutoGeneratingColumn="dataGrid_AutoGeneratingColumn">
    <DataGrid.Resources>
        <Style x:Key="CheckBoxColumnHeaderStyle" 
               TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="270"/>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>
</DataGrid>

部分クラスのハンドラー

private void dataGrid_AutoGeneratingColumn(object sender,
    DataGridAutoGeneratingColumnEventArgs e)
{
    DataGrid grid = sender as DataGrid;
    // Only DataGridCheckBoxColumns
    if (e.PropertyType == typeof(bool))
        e.Column.HeaderStyle =
            (Style)grid.FindResource("CheckBoxColumnHeaderStyle");
}
于 2016-09-04T10:16:06.877 に答える
0

コードを確認しましたが、なぜ Trigger を使用したかったのですか?

必要に応じて、次のコードを確認してください。

<DataGridCheckBoxColumn.ElementStyle>
                <Style TargetType="CheckBox">
                    <Setter Property="VerticalAlignment" Value="Center" />
                </Style>
            </DataGridCheckBoxColumn.ElementStyle>

よろしくお願いします、

メッシ

于 2016-09-04T09:20:49.207 に答える