Как сделать редактирование wpf

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Я создаю сетку данных в Windows Presentation Foundation, и у меня возникла проблема. Когда пользователь дважды щелкает ячейку в моей сетке данных, ячейка переходит в режим редактирования. Я хочу предотвратить это. Вместо этого я хочу, чтобы пользователи могли выбирать всю строку, а не редактировать в ней значения.

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

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

При необходимости вы также можете установить это значение для отдельных столбцов в вашем DataGrid .

Сетка неактивна и больше похожа на отключенное состояние - не похоже на состояние только для чтения из winforms.

Я согласен с Будой Флорином. Установка его на ReadOnly делает его больше похожим на отключение. Disabled и ReadOnly отличаются, потому что ReadOnly обычно позволяет выбирать текст для копирования. Когда вы устанавливаете DataGrid как ReadOnly, вы больше не можете выделять текст в ячейках.

@LeslieDavies, что если я хочу, чтобы они были отключены, но я также хочу иметь возможность удалять элементы из таблицы данных, когда я нажимаю DEL?

чувствую себя совсем тупым. не могу сделать редактируемую таблицу. Пожалуйста распишите процесс создания редактируемой таблицы datagrid!

Ответы (1 шт):

Ну а так, вот вам простейший пример реализации редактируемой таблицы в WPF с паттерном MVVM:

Добавляем вспомогательный класс для реализации ICommand. У всех своя реализация, я возьму эту:

Дальше нам понадобится ViewModel нашего внутреннего объекта. Я буду писать стандартную информацию про человека (имя, фамилия и возраст). В WPF привязка идет к свойствам (не полям), так давайте сделаем необходимые свойства, а для удобства мы будем их заполнять через конструктор:

Хорошо, имея все это можем сделать основную ViewModel нашего приложения, в ней должна быть реализована коллекция, которая будет оповещать интерфейс об изменении (в wpf из коробки этим обладают ObservableCollection и BindingList . Также нам надо реализовать команды (в MVVM паттерне не принято использовать click события.), которые будут показывать информацию выбранного объекта, а также добавлять новый. Так, как нам нужно знать об выбранной строке, сделаем свойство и для этого:

Обратите внимание! Я тут вызываю для наглядности MessageBox.Show , в MVVM это не очень хороший подход!

Ну и остается View, то есть наш XAML. Я сделаю grid, который разделит нашу область на 2 части, в верхнюю помещаю DataGrid, которой разрешено редактировать, добавлять новый и все другие требования, а также привязываю ItemsSource и SelectedItem. В низ я помещаю две кнопки по центру, им задаю текст и привязку у командам:

Остается задать DataContext. Я буду делать чуть не правильно (по правилам он должен быть на уровне выше, к примеру в App), здесь же я сделаю прям в MainWindow:

Вот и все, простейшая реализация DataGrid по всем правилам WPF. Давайте взглянем на результат:

Этой статьей я начинаю свою серию статей “Осваиваем WPF DataGrid”, в которой мы рассмотрим, как работать с элементом управления WPF DataGrid и его функциональность. В этой серии мы узнаем, как использовать элемент управления WPF DataGrid в реальных приложениях.

WPF DataGrid – один из наиболее широко используемых элементов управления (далее для краткости компонент). Компонент DataGrid отображает данные в формате таблицы, а также позволяет добавлять, обновлять, удалять, фильтровать и сортировать данные, отображаемые в DataGrid.

Данная статья является первой статьей, и поэтому называется “Введение”, и она описывает простую привязку данных (data binding).

Создание нового приложения WPF

Создаем приложение WPF с помощью интегрированной среды разработки IDE Visual Studio, и перетаскиваем компонент DataGrid с панели элементов на форму. Ниже показаны панель элементов, форма с DataGrid и просмотр кода XAML.


Конструктор [или дизайнер] IDE Visual Studio не только создает макет компонента, но и создает код XAML. Нижеприведенный листинг демонстрирует типичный XAML-код, созданный конструктором.

Элемент DataGrid в XAML представляет компонент DataGrid, а свойства Width и Height – ширину и высоту DataGrid. Свойство Margin задает поля размещения DataGrid в окне. Свойство Name представляет имя компонента, являющегося уникальным идентификатором компонента. А теперь изменим имя компонента, отредактировав свойство Name. Измененный код XAML смотрим в листинге 2.

Привязка данных [Data Binding]

Следующий шаг после создания компонента DataGrid – отображение в нем некоторых данных. Как известно нам, компонент DataGrid отображает данные в виде таблицы. Таблица представляет собой набор строк и столбцов, поэтому наши данные также быть в одном и том же формате.

Коллекция данных [Data Collection]

Прежде чем мы сможем отобразить данные в DataGrid, у нас должны быть какие-нибудь данные. Данные, которые являются коллекцией объектов.

Давайте создадим класс, который имеет некоторые общедоступные свойства. Фрагмент кода в листинге 3 определяет класс Author с пятью общедоступными свойствами. Эти свойства таковы: ID, Name, BookTitle и Sci-Fi с соответствующими типами int, string, string и bool.


Теперь у нас есть объект. Все, что нам нужно сделать, – это создать коллекцию. Как только у нас будет коллекция объектов, мы сможем отобразить их данные в DataGrid.

Фрагмент кода в листинге 4 создает список объектов-авторов с помощью метода LoadCollectionData.

ItemsSource

Свойство ItemsSource компонента DataGrid является ключом к привязке данных. Пользователь может связать любой источник данных, который реализует IEnuemerable. Каждая строка в DataGrid привязана к объекту источника данных, и каждый столбец – к свойству объектов источника данных. Чтобы отобразить коллекцию данных в DataGrid, нам просто нужно привязать его свойство ItemsSource к коллекции Author, которую мы создали в классе AuthorCollection. Щелкаем по форме, используем окном свойств и создаем обработчик события Window Loaded. В обработчике событий Window Loaded мы создаем объект AuthorCollection и вызываем его метод LoadAuthors() для привязка к DataGrid, задав свойство ItemsSource в DataGrid.

Сборка и запуск


Как видим на вышеприведенном скрине, имена свойств объекта автоматически генерируются в виде столбцов DataGrid с названием, являющимся именем свойства.

Заключение В этой первой статье мы рассмотрели, как создается DataGrid с помощью Visual Studio и отображаются в нем некоторые данные. В следующей статье мы рассмотрим некоторые общие свойства компонента WPF DataGrid.

Я новичок в WPF и пытаюсь создать текстовый редактор для языка ассемблера. Ассемблер предоставляет мне два списка:

  • список ошибок
  • список предупреждений

Как я сказал, что я новичок в WPF, я не знаю контрольную библиотеку, и у меня нет слишком много времени, чтобы копаться и подружиться с Google.

Так что я был бы очень признателен, если бы кто-нибудь мог указать мне хотя бы на элементы управления, необходимые для разработки моего графического интерфейса.

Я новичок в WPF. Я просто хочу знать, как мы должны добавлять столбцы и строки программно в DataGrid в WPF. То, как мы это делали в окнах. создавать столбцы и строки таблицы и привязывать их к DataGrid.

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

ОТВЕТЫ

Ответ 1

Чтобы программно добавить строку:

Чтобы программно добавить столбец:

Обратитесь этот пост на доске объявлений WPF DataGrid для получения дополнительной информации.

Ответ 2

попробуйте это, он работает на 100%: добавьте столбцы и строки программно: вам необходимо сначала создать класс элемента:

Ответ 3

У меня была та же проблема. Добавление новых строк в WPF DataGrid требует трюка. DataGrid полагается на поля свойств объекта item. ExpandoObject позволяет динамически добавлять новые свойства. В приведенном ниже коде объясняется, как это сделать:

Обратите внимание: это не так, как этот компонент должен использоваться, однако он упрощает работу, если у вас есть только программно сгенерированные данные (например, в моем случае: последовательность функций и выход нейронной сети).

Ответ 4

Я нашел решение, которое добавляет столбцы во время выполнения и связывается с DataTable .

К сожалению, с 47 столбцами, определенными таким образом, он не привязывается к данным, достаточно быстрому для меня. Любые предложения?

XAML

xaml.cs используя System.Windows.Data;

Ответ 5

edit: извините, у меня больше нет кода, упомянутого ниже. Это было аккуратное решение, хотя и сложное.

Я разместил образец проекта, описывающий использование делегатов PropertyDescriptor и лямбда с динамическим ObservableCollection и DynamicObject для заполнения сетки с помощью определений столбцов строго типизированных.

Столбцы могут быть добавлены/удалены во время выполнения динамически. Если ваши данные не являются объектом с известным типом, вы можете создать структуру данных, которая разрешала бы доступ к любому количеству столбцов и указывала бы PropertyDescriptor для каждого "столбца".

Вы можете определить столбцы следующим образом:

Или даже лучше, в случае некоторых реальных объектов

Вы можете указать строго типизированные столбцы (связанные с вашей моделью данных):

Затем вы просто привязываетесь к коллекциям пользователей, а столбцы автоматически генерируются, когда вы их определяете. Строки, переданные дескрипторам свойств, являются именами заголовков столбцов. Во время выполнения вы можете добавить больше PropertyDescriptors, чтобы "Пользователи" добавили еще один столбец в сетку.

Ответ 6

Если у вас уже есть привязка данных на месте, ответ Джон Мойчек отвечает.
Если нет, у вас есть как минимум 2 варианта, о которых я знаю, если вы хотите указать источник своих данных. (Однако я не уверен, действительно ли это line с большинством рекомендаций, например MVVM)

вариант 1:, как сказал ДжонБ. Но я думаю, вы должны использовать свою собственную определенную коллекцию вместо слабо напечатанного DataTable (без обид, но вы не можете сказать из код, который представляет каждый столбец)

xaml.cs

в xaml.cs

Если ваш тип имеет свойство FirstName, вы можете сделать то, что указал Джон Мичек.

Это явно не работает, если вы не знаете свойств, которые вам нужно будет показывать в вашем dataGrid, но если это так, у вас будет больше проблем с этим, и я считаю, что вне сферы действия здесь.

Ответ 7

Если у вас уже есть привязка данных на месте, ответ Джон Мойчек отвечает. Если нет, у вас есть как минимум 2 варианта, о которых я знаю, если вы хотите указать источник своих данных. (Однако я не уверен, соответствует ли это большинству рекомендаций, например MVVM)

Затем вы просто привязываетесь к коллекциям пользователей, а столбцы автоматически генерируются, когда вы их определяете. Строки, переданные дескрипторам свойств, являются именами заголовков столбцов. Во время выполнения вы можете добавить больше PropertyDescriptors, чтобы "Пользователи" добавили еще один столбец в сетку.

Читайте также: