чувствую себя совсем тупым. не могу сделать редактируемую таблицу. Пожалуйста распишите процесс создания редактируемой таблицы 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. Давайте взглянем на результат:
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите, пожалуйста, почему при объявлении делегата не нужно вызывать его конструктор с помощью ключевого слова new?
Привет) Возникла проблема: Необходимо каждые N минут (при событии OnTimerTick) отправлять лог файл (txt) на FTP сервер
Мне необходимо, в выбранной пользователем папке, изменять и переименовывать файлыЯ нашел ассет под unity, рисующий диалоговые окна под windows...
Скачал библиотеку EmguCVВсе делаю по мануалу, однако возникла следующая непонятная для меня ошибка: