Я работаю над упражнением, чтобы улучшить свои навыки в DataGrid. Я (стараюсь) уважать шаблон MVVM.
У меня есть основа c DataGrid:
<DataGrid Grid.Row="1" Grid.Column="1" AutoGenerateColumns="False" AlternatingRowBackground="LightGray" CanUserAddRows="True" ItemsSource="{Binding DataGridSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedItem}">
<DataGrid.Columns>
<DataGridTextColumn Width="50" Header="Id" IsReadOnly="False" Binding="{Binding ID}" />
<DataGridTextColumn Width="*" Header="Firstname" IsReadOnly="False" Binding="{Binding Firstname}" />
<DataGridTextColumn Width="*" Header="Lastname" IsReadOnly="False" Binding="{Binding Lastname}" />
<DataGridTextColumn Width="*" Header="Age" IsReadOnly="False" Binding="{Binding Age}" />
</DataGrid.Columns>
</DataGrid>
Более того, у меня есть следующая модель:
public class Person : ViewModelBase
{
#region Variable
private string _id;
private string _lastname;
private string _firstname;
private string _age;
#endregion Variable
#region Constructor
public Person()
{
}
#endregion Constructor
#region Properties
public string ID
{
get
{
return _id;
}
set
{
_id = value;
OnPropertyChanged("ID");
}
}
public string Firstname
{
get
{
return _firstname;
}
set
{
_firstname = value;
OnPropertyChanged("Firstname");
}
}
public string Lastname
{
get
{
return _lastname;
}
set
{
_lastname = value;
OnPropertyChanged("Lastname");
}
}
public string Age
{
get
{
return _age;
}
set
{
_age = value;
OnPropertyChanged("Age");
}
}
#endregion Properties
#region Public Method
#endregion Public Method
#region Private Method
#endregion Private Method
}
Я хотел бы добавлять, изменять и удалять данные непосредственно из сетки данных. Чтобы успешно выполнить упражнение и поделиться этим сценарием (поскольку многие пытаются реализовать эти функции), я пишу класс ViewModel:
public class DataGridViewModel : ViewModelBase
{
#region Variable
private Random rnd = new Random();
#endregion Variable
#region Constructor
public DataGridViewModel()
{
DataGridSource = new ObservableCollection<object>();
loadData();
DataGridSource.CollectionChanged += _dataGridSource_CollectionChanged;
}
#endregion Constructor
#region Properties
private ObservableCollection<object> _dataGridSource = null;
public ObservableCollection<object> DataGridSource
{
get
{
return _dataGridSource;
}
set
{
_dataGridSource = value;
}
}
private Person _selectedItem;
public Person SelectedItem
{
get
{
return _selectedItem;
}
set
{
_selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
#endregion Properties
#region Public Method
public void loadData()
{
for (int i = 1; i < 20; i++)
{
DataGridSource.Add(new Person()
{
ID = i.ToString(),
Firstname = "Firstname " + i.ToString(),
Lastname = "Lastname " + i.ToString(),
Age = rnd.Next(20, 60).ToString(),
});
}
}
public void AddItems(Person itemsToAdd)
{
Console.WriteLine($"[Persons]\t" +
$"ID :{itemsToAdd.ID}\t " +
$"Firstname : {itemsToAdd.Firstname}\t " +
$"Lastname : {itemsToAdd.Lastname}\t " +
$"Age : {itemsToAdd.Age}\t " +
$"> Added.");
}
public void ModifyItems(Person itemsToModify)
{
Console.WriteLine($"[Persons]\t" +
$"ID :{itemsToModify.ID}\t " +
$"Firstname : {itemsToModify.Firstname}\t " +
$"Lastname : {itemsToModify.Lastname}\t " +
$"Age : {itemsToModify.Age}\t " +
$"> Modified.");
}
public void DeleteItems(Person itemsToDelete)
{
Console.WriteLine($"[Persons]\t" +
$"ID :{itemsToDelete.ID}\t " +
$"Firstname : {itemsToDelete.Firstname}\t " +
$"Lastname : {itemsToDelete.Lastname}\t " +
$"Age : {itemsToDelete.Age}\t " +
$"> removed.");
}
#endregion Public Method
#region Private Method
private void _dataGridSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
//if (e.Action == NotifyCollectionChangedAction.Add)
//{
// foreach (Person item in e.NewItems)
// {
// AddItems(item);
// }
//}
//if (e.Action == NotifyCollectionChangedAction.Replace)
//{
// foreach (Person item in e.NewItems)
// {
// ModifyItems(item);
// }
//}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (Person item in e.OldItems)
{
DeleteItems(item);
}
}
}
#endregion Private Method
Функция Delete работает хорошо. Но это единственный работающий.
Я следовал 11 старому учебнику по codeproject . Когда я реализую IEditableObject в моей модели и соответствующий ему интерфейс, я успешно изменяю данные, но не могу добавить новые.
Модель с IEditableObject:
public class Person : ViewModelBase, IEditableObject
{
#region Variable
private string _id;
private string _lastname;
private string _firstname;
private string _age;
private bool inTxn = false;
#endregion Variable
#region Constructor
public Person()
{
}
#endregion Constructor
#region Properties
public string ID
{
get
{
return _id;
}
set
{
_id = value;
OnPropertyChanged("ID");
}
}
public string Firstname
{
get
{
return _firstname;
}
set
{
_firstname = value;
OnPropertyChanged("Firstname");
}
}
public string Lastname
{
get
{
return _lastname;
}
set
{
_lastname = value;
OnPropertyChanged("Lastname");
}
}
public string Age
{
get
{
return _age;
}
set
{
_age = value;
OnPropertyChanged("Age");
}
}
#endregion Properties
#region Public Method
public void BeginEdit() { inTxn = true; }
public void CancelEdit() { }
public void EndEdit()
{
if (inTxn)
{
Console.WriteLine($"[Persons]\t" +
$"ID :{this.ID}\t " +
$"Firstname : {this.Firstname}\t " +
$"Lastname : {this.Lastname}\t " +
$"Age : {this.Age}\t " +
$"> Modified.");
inTxn = false;
}
}
#endregion Public Method
#region Private Method
#endregion Private Method
}
Я бы предпочел использовать событие CollectionChanged в ObservableCollection для выполнения трех функций. Не могли бы вы помочь мне добиться успеха в этой части?