#c# #datagridview #inotifypropertychanged
#c# #datagridview #inotifypropertychanged
Вопрос:
Мне нужна помощь в реализации INotifyPropertyChanged в моем собственном классе структуры данных. Это для назначения класса, но реализация INotifyPropertyChanged — это дополнение, которое я делаю сверх того, что требует рубрика.
У меня есть класс с именем ‘BusinessRules’, который использует SortedDictionary для хранения объектов типа ‘Employee’. У меня есть DataGridView, показывающий всех моих сотрудников, и я хочу использовать объект класса BusinessRules в качестве источника данных для моего DataGridView. Для назначения требуется контейнер BusinessRules. Я пытался реализовать INotifyPropertyChanged в этом классе, но безуспешно.
Источник данных, с которым я работаю, — это список привязок. В настоящее время я использую этот список привязок в качестве контейнера «коляски» и устанавливаю его в качестве своего источника данных. Каждое изменение, которое я вношу в свой объект класса BusinessRules, отражается на моем объекте класса BindingList. Но это явно неаккуратное программирование, и я хочу сделать лучше.
Я пытался реализовать INotifyPropertyChanged в BusinessRules, но когда я устанавливаю свой экземпляр объекта BusinessRules в качестве источника данных, DataGridView ничего не показывает. Я подозреваю, что проблема заключается в методе NotifyPropertyChanged(). Я не знаю, что передать этому, и что делать с тем, что передается. Большинство примеров касаются изменения имени, но меня больше беспокоит, когда в SortedDictionary добавляется новый объект.
private void NotifyPropertyChanged( Employee emp )
{
PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( emp.FirstName ) );
}
Что мне нужно изменить, чтобы это заработало? Не могли бы вы объяснить, почему моя попытка не работает?
Я, как известно, плохо отношусь к формированию своих вопросов в StackOverflow. Это не намеренно. Пожалуйста, дайте мне знать, какая другая информация вам требуется, и я предоставлю ее так быстро, как смогу.
Ответ №1:
Будет очень полезно, если вы прочтете учебные пособия о том, как реализовать MVVM.
Вы хотели бы иметь базовый класс, который реализует INotifyPropertyChanged
интерфейс. Таким образом, все ваши модели представления должны наследоваться от этого базового класса.
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
// This sample class DelegateCommand is used if you wanna bind an event action with your view model
public class DelegateCommand : ICommand
{
private readonly Action _action;
public DelegateCommand(Action action)
{
_action = action;
}
public void Execute(object parameter)
{
_action();
}
public bool CanExecute(object parameter)
{
return true;
}
#pragma warning disable 67
public event EventHandler CanExecuteChanged;
#pragma warning restore 67
}
Ваша модель представления должна выглядеть следующим образом.
public sealed class BusinessRules : ViewModelBase
Вот пример того, как использовать RaisePropertyChangedEvent
.
public sealed class Foo : ViewModelBase
{
private Employee employee = new Employee();
private string Name
{
get { return employee.Name; }
set
{
employee.Name = value;
RaisePropertyChangedEvent("Name");
// This will let the View know that the Name property has updated
}
}
// Add more properties
// Bind the button Command event to NewName
public ICommand NewName
{
get { return new DelegateCommand(ChangeName)}
}
private void ChangeName()
{
// do something
this.Name = "NEW NAME";
// The view will automatically update since the Name setter raises the property changed event
}
}
Я действительно не знаю, что вы хотите сделать, поэтому я оставлю свой пример таким. Лучше читайте разные учебные пособия, кривая обучения немного крутая.