获取可观察的属性

时间:2019-07-03 09:11:03

标签: eclipse-rcp jface

在E3中,以下是创建IObservableValue的正确方法:

modelObservable = PojoObservables.observeDetailValue((IObservableValue) this.model, this.property, null);
// or
modelObservable = PojoObservables.observeValue(this.model, this.property);

然后您可以通过以下方式从此modelObservable中获取财产:

String property = ((IBeanObservable) modelObservable).getPropertyDescriptor().getName();

现在使用E4,创建IObservableValue的正确方法是:

modelObservable = PojoProperties.value(this.property).observeDetail((IObservableValue) this.model);
// or
modelObservable = PojoProperties.value(this.property).observe(this.model);

但是,方法getPropertyDescriptor()现在返回null。如何以一般方式获取此modelObservable的属性?

1 个答案:

答案 0 :(得分:0)

我能做的最好的就是这种方法:

public static final String findProperty(final IObservable target) {
    String property = null;

    if (target instanceof IBeanObservable) {
        final PropertyDescriptor desc = ((IBeanObservable) target).getPropertyDescriptor();
        property = desc == null ? null : desc.getName();
    }
    if (property == null && target instanceof DecoratingObservableValue) {
        property = getPropertyOfDecorator((DecoratingObservableValue<?>) target);
    }
    return property;
}

private static String getPropertyOfDecorator(DecoratingObservableValue<?> target) {
    try {
        final Field decoratedField = DecoratingObservableValue.class.getDeclaredField("decorated");
        decoratedField.setAccessible(true);
        final Object decorated = decoratedField.get(target);
        if (decorated != null) {
            return findProperty((IObservable) decorated);
        }
        return null;
    } catch (final Exception e) {
        e.printStackTrace();
        return null;
    }
}