Есть ли некоторый способ избежать этого. У меня есть много классов, которые связываются с DataGridViews, и они - просто простой набор свойств с методом считывания по умолчанию и методом set. Таким образом, эти классы очень просты. Теперь я должен реализовать интерфейс INotifyPropertyChanged для них, которые увеличат объем кода много. Есть ли какой-либо класс, которому я могу наследоваться постараться не писать весь этот скучный код? Я отображаю это, я могу наследовать свои классы от некоторого класса и украсить свойства некоторыми атрибутами, и он сделает волшебство. Это возможно?
Я хорошо знаю об Аспектно-ориентированном программировании, но я сделал бы это объектно-ориентированный путь.
Создайте базовый класс контейнера, например:
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; } }
}
}
Примечание: очень упрощенный код
Это зависит; вы можете использовать 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;
}
}
Без AOP, я не думаю, что есть простой способ приспособить это к вашим существующим классам. Как бы вы это ни сделали, вам, по крайней мере, придется изменить все ваши свойства.
Я использую базовый класс, наследующий INotifyPropertyChanged с методом OnPropertyChanged(string propertyName) для запуска события. Затем я использую фрагмент кода Visual Studio для создания свойств, которые автоматически вызывают OnPropertyChanged в сеттере свойств.
Если вы предпочитаете АОП, вы можете попробовать использовать PostSharp . Найдите PostSharp INotifyPropertyChanged, и вы найдете множество статей, объясняющих это, например this и this .
Другой способ - использование генерации кода (скажем, T4 ). См. Обсуждение по адресу: Автоматическая реализация INotifyPropertyChanged посредством генерации кода T4? .
Я использую этот метод, и он хорошо работает.