Как отменить выбор выделенной ячейки в WPF DataGrid с помощью SelectionUnit = Cell - PullRequest
0 голосов
/ 28 июня 2018

Я работаю с VS2015 над приложением WPF. В одном из моих окон WPF я получил DataGrid с SelectionUnit = Cell и SelectionMode = Single. Скорее я получил метод для перемещения строк внутри DataGrid вверх и вниз для сортировки. Сортировка работает, но проблема в том, что последняя ячейка, выбранная курсором мыши, визуально всегда выбрана (синий фон), что может мешать пользователю. Поэтому я попытался удалить эту визуальную маркировку ячейки следующими строками кода:

datagrid.UnselectAllCells();
datagrid.SelectedCells.Clear();

Ни одна из двух строк не работает для меня. Последняя выбранная ячейка все еще выделена.

Как я могу удалить этот выбор?

Любая помощь будет оценена.

Наконец, фрагмент из XAML с определением DataGrid:

<DataGrid x:Name="grdGraphicalElementMatrix" Grid.Row="1" Grid.Column="0"
          HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
          CanUserAddRows="True" 
          IsReadOnly="False"
          AutoGenerateColumns="False"
          SelectionUnit="Cell" SelectionMode="Single"
          CurrentCellChanged="grdGraphicalElementMatrix_CurrentCellChanged"
          ItemsSource="{Binding GraphElemMatrix}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="colXAssignment"
                            Width="1*"
                            Binding="{Binding Path=X}"
                            Header="X"/>
        <DataGridTextColumn x:Name="colYAssignment"
                            Width="1*"
                            Binding="{Binding Path=Y}"
                            Header="Y"/>
    </DataGrid.Columns>
</DataGrid>

grdGraphicalElementMatrix_CurrentCellChanged - это метод, в котором я могу получить выбранную строку и столбец, когда пользователь щелкнул в одной из ячеек, чтобы выбрать ее.

    private void grdGraphicalElementMatrix_CurrentCellChanged(object sender, EventArgs e)
    {
        if (grdGraphicalElementMatrix.CurrentCell != null && grdGraphicalElementMatrix.CurrentCell.Column != null)
        {
            vm.GrdGraphicalElementMatrixSelColIndex = grdGraphicalElementMatrix.CurrentCell.Column.DisplayIndex;
            vm.GrdGraphicalElementMatrixSelRowIndex = grdGraphicalElementMatrix.Items.IndexOf(grdGraphicalElementMatrix.CurrentItem);
        }
    }

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Большое спасибо за помощь и полезные советы. Благодаря Тебе я нашел решение, которое работает.

Сначала я заменил событие CurrentCellChanged на событие SelectedCellsChanged. Затем я перепрограммировал метод перемещения выбранной строки вверх или вниз. Здесь новый код для отмены выбора ячейки со старым индексом строки и выбора ячейки по новому индексу строки.

// UnselectAllCells was correct.
datagrid.UnselectAllCells();
// But a refresh is needed. This was missing.
datagrid.Items.Refresh();
// Selects the cell in the moved row. Focus is needed, so the cell appears selected all the time.
datagrid.CurrentCell = new DataGridCellInfo(datagrid.Items[newIndex], datagrid.Columns[GrdGraphicalElementMatrixSelColIndex]);
datagrid.SelectedCells.Add(datagrid.CurrentCell);
datagrid.Focus();
0 голосов
/ 28 июня 2018

Я установил тестовое приложение, которое может очистить выбор DataGrid - со следующим:

View

<DockPanel>
    <Button Content="Clear Selected" DockPanel.Dock="Bottom" Command="{Binding ClearGridCommand}" CommandParameter="{Binding ElementName=datagrid}"/>
    <DataGrid x:Name="datagrid" 
            CurrentCell="{Binding SelectedCell, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
            SelectionMode="Single" 
            SelectionUnit="Cell" 
            HorizontalAlignment="Stretch" 
            Margin="10" 
            VerticalAlignment="Stretch" 
            ItemsSource="{Binding Customers}" 
            CanUserAddRows="True" 
            IsReadOnly="False"
            AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name"></DataGridTextColumn>
            <DataGridTextColumn Header="No"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</DockPanel>

Примечание. Я передаю сетку данных в командную кнопку через CommandParameter

DataContext

private object selectedCell = null;

public object SelectedCell {
    get { return this.selectedCell; }
    set {
        if (this.selectedCell != value) {
            this.selectedCell = value;
            SetPropertyChanged("SelectedCell");
        }
    }
}

public void ClearGrid(object obj) {
    var dg = obj as DataGrid;
    if (dg != null) {
        dg.UnselectAllCells();
    }
}

Может быть, вы можете получить больше информации, отладив сеттер в SelectedCell. Может быть, он очищается, но переизбран с помощью вашего grdGraphicalElementMatrix_CurrentCellChanged метода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...