Редактирование datagrid wpf

202
18 июля 2018, 21:00

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

Answer 1

Вам бы для начала понять принципы MVVM, как работает WPF приложение и что такое C# язык в целом.

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

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

    public class RelayCommand : ICommand
    {
        private Action action;
        public RelayCommand(Action action) => this.action = action;
        public bool CanExecute(object parameter) => true;
        #pragma warning disable CS0067
        public event EventHandler CanExecuteChanged;
        #pragma warning restore CS0067
        public void Execute(object parameter) => action();
    }
    
  2. Дальше нам понадобится ViewModel нашего внутреннего объекта. Я буду писать стандартную информацию про человека (имя, фамилия и возраст). В WPF привязка идет к свойствам (не полям), так давайте сделаем необходимые свойства, а для удобства мы будем их заполнять через конструктор:

    public class PersonViewModel
    {
        public PersonViewModel(string firstName, string lastName, int age)
        {
            FirstName = firstName;
            LastName = lastName;
            Age = age;
        }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
    
  3. Хорошо, имея все это можем сделать основную ViewModel нашего приложения, в ней должна быть реализована коллекция, которая будет оповещать интерфейс об изменении (в wpf из коробки этим обладают ObservableCollection и BindingList. Также нам надо реализовать команды (в MVVM паттерне не принято использовать click события.), которые будут показывать информацию выбранного объекта, а также добавлять новый. Так, как нам нужно знать об выбранной строке, сделаем свойство и для этого:

    public class MainViewModel
    {
        public ObservableCollection<PersonViewModel> Persons { get; set; } = new ObservableCollection<PersonViewModel>();
        public PersonViewModel SelectedPerson { get; set; }
        public ICommand AddRowCommand { get; set; }
        public ICommand GetRowInfoCommand { get; set; }
        public MainViewModel()
        {
            AddRowCommand = new RelayCommand(AddRow);
            GetRowInfoCommand = new RelayCommand(GetRowInfo);
        }
        private void AddRow() => Persons.Add(new PersonViewModel("Вася", "Пупкин", 13));
        private void GetRowInfo()
        {
            if (SelectedPerson != null)
                MessageBox.Show($"Имя: {SelectedPerson.FirstName}\nФамилия: {SelectedPerson.LastName}\nВозраст: {SelectedPerson.Age}");
        }
    }
    

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

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

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedPerson}" CanUserAddRows="True" CanUserDeleteRows="True" CanUserSortColumns="True" CanUserReorderColumns="True"/>
        <StackPanel Orientation="Horizontal" Grid.Row="1" Height="30" HorizontalAlignment="Center">
            <Button Content="Добавить" Margin="2" Command="{Binding AddRowCommand}"/>
            <Button Content="Информация" Margin="2" Command="{Binding GetRowInfoCommand}"/>
        </StackPanel>
    </Grid>
    
  5. Остается задать DataContext. Я буду делать чуть не правильно (по правилам он должен быть на уровне выше, к примеру в App), здесь же я сделаю прям в MainWindow:

    private MainViewModel MainViewModel { get; } = new MainViewModel();
    public MainWindow()
    {
        InitializeComponent();
        DataContext = MainViewModel;
    }
    

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

READ ALSO
Конструктор делегата

Конструктор делегата

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

186
Получить доступ к файлу, в который постоянно записываются данные

Получить доступ к файлу, в который постоянно записываются данные

Привет) Возникла проблема: Необходимо каждые N минут (при событии OnTimerTick) отправлять лог файл (txt) на FTP сервер

242
Как работать с файлами в Unity на MacOs и Windows

Как работать с файлами в Unity на MacOs и Windows

Мне необходимо, в выбранной пользователем папке, изменять и переименовывать файлыЯ нашел ассет под unity, рисующий диалоговые окна под windows...

179
Конфликт зависимостей EmguCV

Конфликт зависимостей EmguCV

Скачал библиотеку EmguCVВсе делаю по мануалу, однако возникла следующая непонятная для меня ошибка:

199