我正在处理 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 宽度的最小总列宽度,但如果我愿意并启用水平滚动,我仍然可以将列拉伸得比这更宽。
* 随意嘲笑我的代码和标记,建设性的批评总是受欢迎的!