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 の幅の最小合計列幅を許可するオプションが必要ですが、水平スクロールを有効にしたい場合は、列をそれよりも広く伸ばすことができます。
* 私のコードとマークアップを自由に嘲笑してください。建設的な批判はいつでも大歓迎です!