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

Мне нужна помощь в реализации INotifyPropertyChanged в моем собственном классе структуры данных. Это для назначения класса, но реализация INotifyPropertyChanged — это дополнение, которое я делаю сверх того, что требует рубрика.

У меня есть класс с именем «BusinessRules», который использует SortedDictionary для хранения объектов типа «Сотрудник». У меня есть DataGridView, показывающий всех моих сотрудников, и я хочу использовать свой объект класса BusinessRules в качестве источника данных для моего DataGridView. Для назначения требуется контейнер BusinessRules. Я безуспешно пытался реализовать INotifyPropertyChanged в этом классе.

DataSource, с которым я работаю, представляет собой BindingList. В настоящее время я использую этот BindingList в качестве контейнера sidecar и устанавливаю его в качестве источника данных. Каждое изменение, которое я вношу в свой объект класса BusinessRules, отражается в моем объекте класса BindingList. Но это явно корявое программирование, и я хочу сделать лучше.

Я пытался реализовать INotifyPropertyChanged в BusinessRules, но когда я устанавливаю созданный объект BusinessRules в качестве источника данных, DataGridView ничего не показывает. Я подозреваю, что проблема связана с методом NotifyPropertyChanged(). Я не знаю, что передать этому или что делать с тем, что передано. Большинство примеров связаны с изменением имени, но меня больше беспокоит, когда в SortedDictionary добавляется новый объект.

    private void NotifyPropertyChanged( Employee emp )
    {
        PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( emp.FirstName ) );
    }

Что мне нужно изменить, чтобы заставить это работать? Вы объясните, почему моя попытка не работает?

Я, как известно, плохо формирую свои вопросы на StackOverflow. Это не преднамеренно. Пожалуйста, дайте мне знать, какая еще информация вам требуется, и я предоставлю ее как можно быстрее.

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


person Adam Howell    schedule 12.10.2016    source источник


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

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

person jegtugado    schedule 12.10.2016