Как перевести Silverlight 3 DataGridCell в режим редактирования кода? - PullRequest
6 голосов
/ 25 января 2010

Я хочу иметь возможность выбрать определенную ячейку в сетке данных Silverlight 3.0 и перевести ее в режим редактирования. Я могу использовать VisualTreeManager, чтобы найти ячейку. Как перейти в режим редактирования?

Каждый DataGridCell выглядит в VisualTreeManager следующим образом:

          System.Windows.Controls.DataGridCell
            System.Windows.Controls.Grid
              System.Windows.Shapes.Rectangle
              System.Windows.Controls.ContentPresenter
                System.Windows.Controls.TextBlock
              System.Windows.Shapes.Rectangle
              System.Windows.Shapes.Rectangle

с TextBlock, содержащим текст, который я хочу редактировать.

Обновление

Следуя совету @AnthonyWJones, вот как я пытался сделать это, используя BeginEdit ().

Я хотел, чтобы все было просто, поэтому я решил выбрать столбец в первом ряду. Даже это оказалось за пределами моего знания SL! В конце я получаю первую строку, создав поле с именем firstRow для его хранения:

private DataGridRow firstRow;

добавил обработчик LoadingRow в DataGrid:

LoadingRow="computersDataGrid_LoadingRow"

и

private void computersDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    if (this.firstRow == null)
        this.firstRow = e.Row;
}

и затем добавление кнопки на панель для запуска редактирования:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.dataGrid.SelectedItem = this.firstRow;
    this.dataGrid.CurrentColumn = this.dataGrid.Columns[4];
    this.dataGrid.BeginEdit();
}

Я нажимаю кнопку, и выбирается правильная ячейка, но она не редактируется в ячейке. Для этого требуется ручной щелчок.

Ответы [ 2 ]

2 голосов
/ 25 января 2010

Я не уверен, почему вам нужно найти DataGridCell с помощью VisualTreeManager, и в настоящее время я не знаю, как правильно начать редактирование. Вы можете просто изменить визуальное состояние ячейки для редактирования.

 VisualStateManager.GoToState(myDataGridCell, "Editing", true);

Я не уверен, как ведет себя сетка, когда вы делаете что-то подобное выше. Если вам понадобится DataGrid, который поможет вам вернуть изменения в строку, вам может показаться, что ситуация немного изменилась.

«Стандартный» подход заключается в том, чтобы установить свойство DataGrid SelectedItem для элемента, представленного строкой, установить свойство CurrrentColum для объекта DataGridColumn, представляющего столбец, в котором находится ячейка. найденный. Затем вызовите метод BeginEdit.

0 голосов
/ 29 января 2010

Я не могу правильно понять вашу проблему, но у меня была похожая проблема

Я хотел, чтобы только несколько из ячеек сетки были редактируемыми, а остальные - нет. Вместо того, чтобы создавать логику и назначать ReadOnly как true / false, я сделал простую вещь.

  • Пометить все ячейки таблицы как доступные для записи, IsReadOnly как ложные
  • Установите событие PreparingCellForEdit и отправьте обратный вызов
  • Если дважды щелкнуть ячейку, она перейдет в режим редактирования
  • Проверьте, хотите ли вы эту ячейку редактировать
  • Если редактирование разрешено, продолжайте
  • Если эта ячейка только для чтения, позвоните CancelEdit

Пример кода выглядит как

namespace foo
{
    public class foobar
    {
        public foobar()
        {
            sampleGrid = new DataGrid();
            sampleGrid.IsReadOnly = false;
            sampleGrid.PreparingCellForEdit += new EventHandler<DataGridPreparingCellForEditEventArgs>(sampleGrid_PreparingCellForEdit);
        }

        void sampleGrid_PreparingCellForEdit(object sender, DataGridsampleGrid_PreparingCellForEditEventArgs e)
        {
            if (sampleGrid.SelectedItem != null)
            {
                bool isWritableField = CheckIfWritable()

                if (isWritableField == false)
                {
                    sampleGrid.CancelEdit();
                }

                // continue with your logic
            }
        }

        private DataGrid sampleGrid;
    }
}
...