Переопределение DataGridTextColumn - PullRequest
       17

Переопределение DataGridTextColumn

4 голосов
/ 30 августа 2011

Я пытаюсь предоставить столбец DataGrid, который ведет себя как DataGridTextColumn, но с дополнительной кнопкой в ​​режиме редактирования. Я посмотрел на DataGridTemplateColumn, но оказалось, что подкласс DataGridTextColumn проще поделить, как показано ниже

Проблема в том, что textBox теряет свою привязку при добавлении в сетку. То есть изменения в его свойстве Text не отражаются в текстовом блоке без редактирования или в базовом режиме просмотра

Есть мысли о том, почему это может быть и как я могу обойти это?

public class DataGridFileColumn : DataGridTextColumn
{
    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        TextBox textBox = (TextBox)base.GenerateEditingElement(cell, dataItem);

        Button button = new Button { Content = "..." };
        Grid.SetColumn(button, 1);

        return new Grid
        {
            ColumnDefinitions = {
                new ColumnDefinition(),
                new ColumnDefinition { Width = GridLength.Auto },
            },
            Children = {
                textBox,
                button,
            },
        };
    }
}

Я использую .NET 3.5 и набор инструментов WPF

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Оказывается, вам также нужно переопределить PrepareCellForEdit, CommitCellEdit и CancelCellEdit

Базовый класс предполагает (не без оснований), что переданный FrameworkElement будет TextBox

0 голосов
/ 30 августа 2011

Я думаю, что вы должны установить привязку вручную в методе GenerateEditingElement (...).

После того, как вы взяли TextBox из базового класса, установите его привязку следующим образом:

textBox.DataContext = dataItem;
textBox.SetBinding(TextBlock.TextProperty, Binding);

Это все равно работает для меня.

Обратите внимание, я не уверен , почему это работает, так как чтение документации для GenerateEditingCell подразумевает для меня, что TextBox, который вы извлекаете из базового класса, уже должен иметь свои привязки настроить правильно. Однако, вышеупомянутый подход - то, что они сделали в этом сообщении в блоге .

EDIT:

На самом деле вам не нужно устанавливать привязку, это уже сделано (как сказано в документации). Тем не менее, вам необходимо настроить DataContext, поскольку по какой-то причине он не настроен для textBox, возвращаемого из базового класса.

...