Как реализовать INotifyPropertyChanged

#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. Это не намеренно. Пожалуйста, дайте мне знать, какая другая информация вам требуется, и я предоставлю ее так быстро, как смогу.

Вот ссылка на исходный код моих BusinessRules.

Ответ №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
    }
}
  

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