1

我正在处理 WPF 中包含 DataGrid 的应用程序。我允许用户选择他们想要查看或隐藏的列,并且我还允许用户调整列的大小。当用户隐藏太多列,或者将列的大小调整到比 DataGrid 的宽度更窄的程度时,我希望这些列的操作就像其中一个具有*宽度一样。当用户扩展列宽于 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,但行为没有变化。

如果我将其中一列的宽度设置为*,我似乎无法启用滚动。列的组合宽度固定为 DataGrid 的宽度。

当我没有将其中一列的宽度设置为 时*,如果用户选择隐藏所有可选列,我会在数据右侧看到讨厌的空单元格。

我需要一些选项来允许我使用 DataGrid 宽度的最小总列宽度,但如果我愿意并启用水平滚动,我仍然可以将列拉伸得比这更宽。

* 随意嘲笑我的代码和标记,建设性的批评总是受欢迎的!

4

0 回答 0