Многоуровневая привязка данных Master / Detail с помощью EMF и RCP - PullRequest
4 голосов
/ 30 мая 2011

Я сделал модель с EMF, представляющей настройки устройства, и RCP GUI.В графическом интерфейсе у меня есть список для выбора различных устройств типа модели (Master).

Модель имеет список объектов небольшого класса, который должен отображаться в таблице (Detail).

Табличные элементы необходимо редактировать, поэтому у меня есть небольшая графическая часть с флажками и т. Д. Для изменения настроек.Здесь tableitem является главным, а все поля, отображаемые в графическом интерфейсе, являются подробностями.

Доступно для списка устройств:

IObservableValue selection = ViewersObservables.observeSingleSelection(availableDevicesList);

Таблица:

IObservableList list = EMFObservables.observeDetailList(Realm.getDefault(), selection,DevicePackage.Literals.LIST);

TableViewer tableViewer = new TableViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
tableViewer.setInput(list);

IObservableValue tableSelection = ViewersObservables.observeSingleSelection(tableViewer);

Редактирование:

Spinner field1 = new Spinner(parent, SWT.BORDER);

dbc.bindValue(SWTObservables.observeSelection(field1), EMFObservables.observeDetailValue(Realm.getDefault(), tableSelection, DevicePackage.Literals.Value1));

При изменении выбора устройства табличные элементы заменяются.Но у tableSelection, похоже, есть проблема с этим.Иногда он все еще содержит значения элемента таблицы с другого устройства, а иногда он просто содержит ноль.У меня также есть кнопка, которая включается / отключается в соответствии со статусом проверки всех полей.Когда tableSelection помещает null в эти поля, проверка не работает, и кнопка отключается до тех пор, пока не будет выбрана запись в таблице.

Я попытался вручную установить выбор пустым с помощью прослушивателя в списке и:

tableViewer.setSelection(StructuredSelection.EMPTY, true);

, но это не делает полную работу.По крайней мере, все "старые" значения заменены, но проблема с нулем все еще возникает.

Все, что мне нужно, это установить tableSelection в пустое состояние, как после запуска приложения, когда еще не было выбрано ни одного элемента таблицы.

1 Ответ

2 голосов
/ 07 июня 2011

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

Я решил это, предоставив специальный конвертер (из int в int ...), в котором я возвращаю значение по умолчанию, если источник является нулевым. Теперь проверка работает нормально, и состояние включения моей кнопки установлено правильно.

...