Как постараться не реализовывать INotifyPropertyChanged вручную

Есть ли некоторый способ избежать этого. У меня есть много классов, которые связываются с DataGridViews, и они - просто простой набор свойств с методом считывания по умолчанию и методом set. Таким образом, эти классы очень просты. Теперь я должен реализовать интерфейс INotifyPropertyChanged для них, которые увеличат объем кода много. Есть ли какой-либо класс, которому я могу наследоваться постараться не писать весь этот скучный код? Я отображаю это, я могу наследовать свои классы от некоторого класса и украсить свойства некоторыми атрибутами, и он сделает волшебство. Это возможно?

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

8
задан Max 28 June 2010 в 06:37
поделиться

5 ответов

Создайте базовый класс контейнера, например:

abstract class Container : INotifyPropertyChanged
{
  Dictionary<string, object> values;

  protected object this[string name]
  {
    get {return values[name]; }
    set 
    { 
      values[name] = value;
      PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
  }
}

class Foo : Container
{
  public int Bar 
  {
    {get {return (int) this["Bar"]; }}
    {set { this["Bar"] = value; } }
  }
}

Примечание: очень упрощенный код

4
ответ дан 5 December 2019 в 11:22
поделиться

Это зависит; вы можете использовать PostSharp для написания такого атрибута, который перезаписывается ткачом; однако я бы склонился к тому, чтобы просто сделать это вручную - возможно, используя общий метод для обработки обновлений данных, т.е.

private string name;
public string Name {
    get { return name; }
    set { Notify.SetField(ref name, value, PropertyChanged, this, "Name"); }
}

с:

public static class Notify {
    public static bool SetField<T>(ref T field, T value,
         PropertyChangedEventHandler handler, object sender, string propertyName)
    {
        if(!EqualityComparer<T>.Default.Equals(field,value)) {
            field = value;
            if(handler!=null) {
                handler(sender, new PropertyChangedEventArgs(propertyName));
            }
            return true;
        }
        return false;
    }
}
9
ответ дан 5 December 2019 в 11:22
поделиться

Без AOP, я не думаю, что есть простой способ приспособить это к вашим существующим классам. Как бы вы это ни сделали, вам, по крайней мере, придется изменить все ваши свойства.

Я использую базовый класс, наследующий INotifyPropertyChanged с методом OnPropertyChanged(string propertyName) для запуска события. Затем я использую фрагмент кода Visual Studio для создания свойств, которые автоматически вызывают OnPropertyChanged в сеттере свойств.

1
ответ дан 5 December 2019 в 11:22
поделиться

Если вы предпочитаете АОП, вы можете попробовать использовать PostSharp . Найдите PostSharp INotifyPropertyChanged, и вы найдете множество статей, объясняющих это, например this и this .

0
ответ дан 5 December 2019 в 11:22
поделиться

Другой способ - использование генерации кода (скажем, T4 ). См. Обсуждение по адресу: Автоматическая реализация INotifyPropertyChanged посредством генерации кода T4? .

Я использую этот метод, и он хорошо работает.

0
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: