如何将一个属性绑定到列表属性中的对象的属性?

标记

我有这些课:

class Parent {

    BooleanProperty total = new SimpleBooleanProperty();
    SimpleListProperty<Child> children = new SimpleListProperty<>(FXCollections.observableArrayList());
}

class Child {

    BooleanProperty single = new SimpleBooleanProperty();
}

我想要的是,total当且仅当所有孩子的singles均为假时,才会为假。换句话说,当且仅当有一个孩子single为true时,才total为true。

我想出了这种绑定

total.bind(Bindings.createBooleanBinding(() -> {
    return children.stream().filter(c -> c.isSingle()).findAny().isPresent();
}, children.stream().map(c -> c.single).collect(Collectors.toCollection(FXCollections::observableArrayList))));

这是最好的方法吗?

此外,我应该做total只读,因为写一个绑定属性将抛出一个异常?

詹姆斯·D

有明确绑定到每一个孩子的一个可能的问题single性质,就是当这些绑定是由total.bind(...)被调用语句。因此,如果随后Child对象添加到列表中,则将不会观察那些子级的属性,并且如果更改了它们,绑定也不会无效。同样,如果一个孩子从列表中删除,它的属性不会松绑。singlesingle

作为替代方案,您可以创建具有列表提取请注意,对于大多数使用情况,您不需要ListProperty:,只需ObservableList直接使用即可。所以你可以做

ObservableList<Child> children = 
    FXCollections.observableArrayList(c -> new Observable[]{c.singleProperty()});

现在,如果任何元素single属性无效(以及将元素添加到列表或从列表添加元素),此列表将触发更新通知(并变为无效)。换句话说,列表本身观察每个孩子的single属性,并且如果任何孩子的single属性变为无效,则列表变为无效(导致与其绑定的任何内容变为无效)名单中还可以确保其遵守新的儿童single,当他们被添加到列表属性,并停止观察他们时,孩子被从列表中删除。

那你只需要

total.bind(Bindings.createBooleanBinding(() -> 
    children.stream().anyMatch(Child::isSingle), children);

最后,考虑使用aReadOnlyBooleanWrapper来将属性公开为只读。这是整件事的正确封装版本:

public class Parent {

    private ReadOnlyBooleanWrapper total = new ReadOnlyBooleanWrapper();
    private ObservableList<Child> children = 
        FXCollections.observableArrayList(c -> new Observable[] {c.singleProperty()});

    public Parent() {
        total.bind(Bindings.createBooleanBinding(() -> 
            children.stream().anyMatch(Child::isSingle), children);
    }

    public ReadOnlyBooleanProperty totalProperty() {
        return total.getReadOnlyProperty();
    }

    public ObservableList<Child> getChildren() {
        return children ;
    }

}

public class Child {
    private final BooleanProperty single = new SimpleBooleanProperty();

    public BooleanProperty singleProperty() {
        return single ;
    }

    public final boolean isSingle() {
        return singleProperty().get();
    }

    public final void setSingle(boolean single) {
        singleProperty().set(single);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将多个 TextField 属性绑定到一个按钮中

如何将控件的属性绑定到另一个控件的属性

如何将属性绑定到动态对象列表

如何将一个属性绑定到另一个类的属性(没有UI控件)?

如何将多选列表绑定到对象列表中的属性?

如何将一个用户控件的视图模型中的属性绑定到另一个用户控件中的属性

如何将2个文本框绑定到一个属性?

如何将一个属性绑定到style.width以像素为单位?

在Coffeescript中,如何将一个对象的数组按一个属性分组?

如何将一个Python对象的所有属性复制到另一个对象?

如何将多个构面结果合并到具有一个属性的对象列表中

如何使用OData模型将两个数据属性直接绑定到一个控件属性中?

将listview绑定到对象列表中的对象的属性

如何将属性从一个.net对象复制到另一个

JAVA-如何将一个对象的属性复制到另一个具有相同属性的对象?

如何将剑道下拉列表绑定到模型属性?

Silverlight 如何将属性绑定到列表项值

如何将函数绑定到对象属性?

如何将控件绑定到对象属性?

JavaFX:将列表绑定到另一个列表的元素的成员属性

如何将1个以上的属性绑定到元素?

如何将属性从一个 Bean 复制到另一个并忽略嵌套对象的属性

如何将实体属性与来自另一个实体的对象列表的对象进行映射?

Datagrid将一个对象的多个属性绑定到列

WPF 将 SelectedItem 绑定到另一个对象的属性

如何将前景绑定到属性

如何将 ContentView 绑定到属性?

如何将下拉列表中的 selectlistitem 值绑定到模型中的字符串属性

如何在Kivy中将一个属性绑定到另一个属性?