Создание события, которое срабатывает при обновлении списка - PullRequest
2 голосов
/ 08 апреля 2009

У меня есть статический класс (DataFormSubject), который содержит общий объект List следующим образом:

private static List<DataForm> dataForms = new List<DataForm>();

Другие классы, которые полагаются на этот список, должны быть указаны при обновлении списка, поэтому я создал пользовательское событие и связанные с ним методы, которые могут запускаться при добавлении или удалении элемента, следующим образом:

    public delegate void DataFormsUpdatedHandler(object sender);
    public static event DataFormsUpdatedHandler DataFormsUpdatedEvent;

    public static void AddDataForm(DataForm df)
    {
        dataForms.Add(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }

    public static void RemoveDataForm(DataForm df)
    {
        dataForms.Remove(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }

Список доступен из статического класса через свойство следующим образом:

   public static List<DataForm> DataForms
    {
        get { return dataForms; }
        //set { dataForms = value; }
    }

Но проблема здесь в том, что клиент теперь может обойти событие обновления, получив доступ к свойству и выполнив прямое добавление или удаление класса! Э.Г.

     DataFormSubject.DataForms.Add(new DataForm);

Как я могу предотвратить это, или есть лучший способ добиться того, чего я хочу? В идеале мне бы хотелось, чтобы событие класса «Класс», на которое могут подписаться наблюдатели, обновилось!

Ответы [ 3 ]

4 голосов
/ 08 апреля 2009

Рассмотрите возможность использования BindingList<T> или ObservableCollection<T>; оба они делают то, что вы хотите стандартными способами.

Вы не можете сделать ничего интересного, создав подкласс List<T> - методы не являются виртуальными. Collection<T> разработан, чтобы быть более расширяемым, но в этом случае все, что вам нужно, уже предоставлено (BindingList<T>).

В частности, это обеспечивает:

  • IBindingList (используется многими компонентами привязки пользовательского интерфейса, такими как сетки)
  • ListChanged - на ваш код можно подписаться для подробного уведомления
2 голосов
/ 08 апреля 2009

Вы хотите использовать ObservableCollection для этой цели. См. эту статью MSDN , чтобы начать работу.

0 голосов
/ 08 апреля 2009

Не показывать IList из статического класса, только показывать Enumerable:

public static IEnumerable<DataForm> DataForms
{
    get { return dataForms; }
    //set { dataForms = value; }
}

Таким образом, все изменения должны быть сделаны через ваш класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...