Każdy element modelu wizualnego posiada wartości swoich atrybutów. Dany typ elementu (Node, ConnectionGroup itp.) posiada osobny zbiór możliwych atrybutów. Atrybut posiada nazwę, typ, wartość domyślną, oraz opcje informujące czy jest wymagany, czy jest wbudowany w aplikację bądź dodany przez użytkownika, czy jest edytowalny, czy ma być pokazywany na diagramie jako etykieta, oraz czy nazwa atrybutu jest lokalizowana.
Atrybut na diagramie reprezentuje klasa Attribute z odpowiednimi polami, odpowiadającymi przedstawionemu wyżej opisowi. Za zarządzanie zarejestrowanymi atrybutami odpowiada AttributeManager. Dla poszczególnych typów elementów modelu wizualizacyjnego dostarczone są odpowiednie specjalizacje AttributeManagera - ich zadaniem jest rejestrowanie w menedżerze wbudowanych właściwości dla danego typu, np. Id i Label dla Node.
Ponieważ atrybuty są rejestrowane dla danego typu elementu w obrębie jednego diagramu, klasa Diagram posiada referencje na DiagramAttributeManager, ale także na menedżera atrybutów dla Node i ConnectionGroup. W ten sposób przy tworzeniu nowych obiektów tych typów odpowiedni menedżer atrybutów jest do nich wstrzykiwany przez konstruktor. Dodatkowo oczywiście poszczególne obiekty mają referencję na swojego menedżera typów.
W klasie ModelElement znajduje się kolekcja wartości atrybutów danego elementu. Przechowywane tam wartości nie są zsynchronizowane z zarejestrowanymi w menedżerze atrybutami - byłoby to zbyt kosztowne; dodanie czy usunięcie atrybutu w menedżerze nie dodaje/usuwa wartości we wszystkich elementach danego typu! Zamiast tego dopiero w momencie pobierania wartości atrybutów danego elementu dokonywane jest sprawdzenie, czy atrybuty dalej są zarejestrowane. Jeśli nie, wartość nie jest zwracana. Analogicznie, jeśli pojawił się nowy atrybut, zwracany jest tymczasowy obiekt reprezentujący domyślną wartość atrybutu.
Do operacji na elementach posiadających atrybuty przeznaczony jest interfejs AttributeValueContainer, którego podstawowa implementacja jest zawarta w klasie ModelElement. Ten interfejs jest używany np. w GUI do edycji wartości atrybutów.
Domyślna implementacja ModelElement wysyła powiadomienia o zmianach wartości atrybutów. Implementuje ona interfejs IPropertyChangeProvider, do którego można dodawać obiekty implementujące PropertyChangeListener.
PropertyChangeEvent wysyłany przy zmianie wartości atrybutu zawiera następujące dane:
Przykładowy kod korzystający z powiadomień o zmianach wartości atrybutów (z klasy SchemaNodeEditPart):
public void propertyChange(PropertyChangeEvent event) { ... } else if (ModelElement.ATTRIBUTE_CHANGE.equals(event.getPropertyName())) { attributeValueChange((AttributeValue) event.getOldValue(), event.getNewValue()); } } private void attributeValueChange(AttributeValue oldValue, Object newValue) { String attributeName = oldValue.getAttribute().getName(); ... } else if (NodeAttributeManager.PERMANENT_ISMAIN.equals(attributeName)) { refreshVisuals(); } }