чувствую себя совсем тупым. не могу сделать редактируемую таблицу. Пожалуйста распишите процесс создания редактируемой таблицы datagrid!
Вам бы для начала понять принципы MVVM, как работает WPF приложение и что такое C# язык в целом.
Ну а так, вот вам простейший пример реализации редактируемой таблицы в WPF с паттерном MVVM:
Добавляем вспомогательный класс для реализации 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();
}
Дальше нам понадобится 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; }
}
Хорошо, имея все это можем сделать основную 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 это не очень хороший подход!
Ну и остается 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>
Остается задать DataContext. Я буду делать чуть не правильно (по правилам он должен быть на уровне выше, к примеру в App), здесь же я сделаю прям в MainWindow:
private MainViewModel MainViewModel { get; } = new MainViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = MainViewModel;
}
Вот и все, простейшая реализация DataGrid по всем правилам WPF. Давайте взглянем на результат:
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости