Как поместить текстовые поля в сетку данных? - PullRequest
0 голосов
/ 30 июля 2010

VS 2010, проект WPF.

У меня есть таблица данных с текстом во всех ячейках (данные из массива пользовательских объектов).Однако я не могу скопировать (ctrl + c) содержимое любой ячейки.Поэтому я хотел бы использовать текстовые поля для отображения содержимого каждой ячейки.Реальная проблема в том, что я не могу сделать это в XAML, но я должен делать это динамически в коде, потому что вся сетка создается вручную в коде, поэтому XAML знает только, что есть сетка.Кстати, все, что я нашел в связи со столбцом, это то, что я могу указать шаблон заголовка.Как создать шаблон ячейки для него и установить виджет в текстовое поле?

            int i = 0;

            foreach (var db_col in query.FieldNames)
            {
                var col = new DataGridTextColumn();
                col.IsReadOnly = false;
                col.Header = db_col;
                col.Binding = new Binding(String.Format("Visual[{0}]", i));
                grid.Columns.Add(col);

                ++i;
            }

Заранее спасибо.

Решено

Спасибо Марко, я наконец-то подошелс таким решением.

        foreach (var db_col in query.FieldNames)
        {
                var template = new DataTemplate();
                var elemFactory = new FrameworkElementFactory(typeof(TextBox));
                elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i)));
                template.VisualTree = elemFactory;

                var col = new DataGridTemplateColumn();
                col.CellTemplate = template;
                col.IsReadOnly = true;
                col.Header = db_col;
                grid.Columns.Add(col);

                ++i;
        }

1 Ответ

2 голосов
/ 31 июля 2010

Прежде всего, DataGridTextColumn использует TextBlock для отображения данных, когда ячейка не находится в режиме редактирования.Наверное, поэтому вы ничего не можете скопировать с него.После того, как вы войдете в режим редактирования, текстовый блок будет заменен на текстовый, и тогда вы сможете копировать / вставлять, как обычно.

Учитывая, что размещенный вами код не обеспечивает нужную вам функциональность, я могутолько предположим, что вы хотите всегда показывать TextBox.Чтобы сделать это, вам нужно использовать DataGridTemplateColumn.Итак, в своем коде вы должны создать новый DataGridTemplateColumn, установить для его CellTemplate новый DataTemplate, в котором inturn содержит TextBox.Некоторые примеры создания DataTemplate с TextBox вы найдете здесь: Могу ли я создать DataTemplate в программном коде?

Также обратите внимание, что если вы создаете DataGridTemplateColumn, вам нужно переопределитьнеобходимо) некоторое поведение, встроенное в другие столбцы таблицы данных.Например, если для DataGrid установлено значение IsReadOnly = true, то ваш DataGridTemplateColumn с вашим TextBox все еще можно редактировать.Поэтому вам необходимо связать свойство TextBox.IsReadOnly со свойством DataGrid.IsReadOnly.

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