WPF データグリッドで選択を操作したいのですが、実際のセルにアクセスしてフォーカスを設定し、選択済みとしてマークすることに問題があります。
誰でも説明できますか: **DatagridCellInfo** から **DatagridCell** を取得する簡単な方法がないのはなぜですか?- SOでWPFデータグリッドを扱っている人がほとんどいないのはなぜですか? (投票数が多い Q/A はあまり見られません)
- WPF データグリッドの独自の選択モードを作成する簡単な方法はありますか?
私の問題は何ですか
Ctrlを押さずに複数のセルを(1つずつ)選択するときに、WPF Datagridでカスタム選択を行いたいと思いました。私はそれを非常にうまくやったが、選択したセルの1つを選択解除したいときに問題が発生している-単にクリックするだけである. リストから削除しても問題ありません。問題は、クリックするとフォーカスが当たってハイライトされ、選択された他のすべてのハイライトがオフになることです。選択されていない別のセルを選択すると、選択したすべてのセルが再び正しく強調表示されます。問題は選択解除だけです。
私のコード:
XAML:
<Window x:Class="SelectionTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="DataGridCell">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Pink"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<DataGrid
Name="mydatagrid"
Width="Auto" Height="Auto"
HeadersVisibility="All"
AutoGenerateColumns="True" IsReadOnly="True"
SelectionMode="Extended" SelectionUnit="Cell"
CanUserAddRows="False" CanUserDeleteRows="False"
CanUserResizeColumns="False" CanUserResizeRows="False"
CanUserReorderColumns="False" CanUserSortColumns="False"
SelectedCellsChanged="mydatagrid_SelectedCellsChanged"
Padding="10" HorizontalAlignment="Center" VerticalAlignment="Top"
>
</DataGrid>
</Grid>
</Window>
私が作成したいくつかのランダムなサンプル クラス オブジェクトのリストでデータグリッドを埋めました。
C#:
private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
DataGridCellInfo cellInfo = new DataGridCellInfo(cell);
if ((cell.IsSelected)||(selectedList.Contains(cellInfo))||(selectedCellsList.Contains(cell)))
{
selectedList.Remove(cellInfo);
selectedCellsList.Remove(cell);
cell.IsSelected = false;
mydatagrid.CurrentCell = selectedList[0];
}
else
{
if (selectedList.Count < 7)
{
selectedList.Add(cellInfo);
selectedCellsList.Add(cell);
}
else
{
selectedList.RemoveAt(0);
selectedList.Add(cellInfo);
selectedCellsList.RemoveAt(0);
selectedCellsList.Add(cell);
}
}
mydatagrid.SelectedCells.Clear();
mydatagrid.UnselectAll();
foreach (DataGridCell xcell in selectedCellsList)
{
xcell.IsSelected = true;
xcell.Focus();
}
}
このコードが本当に醜いように見える場合は、申し訳ありません。しかし、私はまだ少しチャルパワンです。
ショートカットの問題は何ですか:選択したセルをクリックすると、そのセルだけがハイライトされてフォーカスされ、他のすべての選択されたセルがハイライトされます。これは、私がやりたいこととは正反対です。(まだ選択されていない他のセルをクリックすると、希望どおりに機能します。)