1

DataGrid を含む WPF のアプリケーションに取り組んでいます。ユーザーが表示または非表示にする列を選択できるようにし、ユーザーが列のサイズを変更できるようにします。ユーザーが非表示にする列が多すぎる場合、または DataGrid の幅よりも狭くなるように列のサイズを変更した場合、列の 1 つに*幅があるかのように列を操作したいと考えています。ユーザーが DataGrid の幅よりも幅の広い列を展開する場合、水平スクロールを許可したいと考えています。何ヶ月もWPFを使っていないので、おそらく何か単純なものが欠けていますが、私が試したことはすべて望ましくない動作につながるようです.

<DataGrid Margin="12,29,12,41" Name="sanitized" ItemsSource="{Binding sanitized}" AutoGenerateColumns="False" MouseDoubleClick="sanitized_MouseDoubleClick" >
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="" Binding="{Binding Path=sanitized}" IsReadOnly="False" CellStyle="{StaticResource GenericCellStyle}"/>
        <DataGridTextColumn Header="sanitized" Binding="{Binding Path=sanitized}" IsReadOnly="True" CellStyle="{StaticResource GenericCellStyle}" />
        <DataGridTextColumn Header="sanitized" Binding="{Binding Path=sanitized}" IsReadOnly="True" CellStyle="{StaticResource GenericCellStyle}" />
        <DataGridTextColumn Header="sanitized" Binding="{Binding Path=sanitized}" IsReadOnly="True" CellStyle="{StaticResource GenericCellStyle}" />
        <DataGridTextColumn Header="sanitized" Binding="{Binding Path=sanitized}" IsReadOnly="True" CellStyle="{StaticResource GenericCellStyle}" />
        <DataGridTextColumn Header="sanitized" Binding="{Binding Path=sanitized}" IsReadOnly="True" CellStyle="{StaticResource GenericCellStyle}" />
    </DataGrid.Columns>
</DataGrid>

私の GenericCellStyle は、行の最初のクリックで DataGridCheckBoxColumn をチェックできるようにし、Cell と FullRow の間で SelectionUnit を切り替えるだけです。

<Style TargetType="{x:Type DataGridCell}" x:Key="GenericCellStyle">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="sanitized_Click" />
</Style>

コードビハインド:

private void sanitized_Click(object sender, MouseButtonEventArgs e)
{
    var cell = sender as DataGridCell;
    if (cell != null && cell.Column is DataGridCheckBoxColumn)
    {
        sanitized.SelectionUnit = DataGridSelectionUnit.Cell;
        if (!cell.IsEditing)
        {
            if (!cell.IsFocused)
            {
                cell.Focus();
            }
            DependencyObject dep = cell;
            while (dep != null && !(dep is DataGridRow))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }
            if (dep != null)
            {
                int itemIndex = sanitized.ItemContainerGenerator.IndexFromContainer(dep);
                var selected = (sanitized)sanitizes.Items[itemIndex];
                selected.sanitized= !selected.sanitized;
                // TODO: Move the call to NotifyChange into the sanitized propery.
                selected.NotifyChange("sanitized");
            }
        }
    }
    else
    {
        sanitized.SelectionUnit = DataGridSelectionUnit.FullRow;
    }
}

これにより、CheckBoxColumn を個別に選択することも、他の場所をクリックして行全体を選択することもできます。

DataGrid を含むグリッドに RowDefinitions または ColumnDefinitions がありません。Auto と * の両方の幅を持つ ColumnDefinition を追加しようとしましたが、動作は変わりません。

列の 1 つの幅を に設定すると*、スクロールを有効にできないようです。列を組み合わせた幅は、DataGrid の幅に固定されます。

列の 1 つの幅を に設定しない*場合、ユーザーがオプションの列をすべて非表示にすることを選択すると、データの右側に厄介な空のセルが表示されます。

DataGrid の幅の最小合計列幅を許可するオプションが必要ですが、水平スクロールを有効にしたい場合は、列をそれよりも広く伸ばすことができます。

* 私のコードとマークアップを自由に嘲笑してください。建設的な批判はいつでも大歓迎です!

4

0 に答える 0