WPF DataGrid水平填充或滚动

时间:2012-05-25 17:29:27

标签: c# wpf xaml datagrid

我正在使用包含DataGrid的WPF中的应用程序。我允许用户选择他们想要查看或隐藏的列,我还允许用户调整列的大小。当用户隐藏太多列,或者将列的大小调整为比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宽度的最小总列宽,但是如果我愿意的话,我仍然允许我将列拉伸得更宽,并启用水平滚动。

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

0 个答案:

没有答案