That also looks very useful, although having a converter interface would be more similar to the existing `javafx.util.StringConverter` class and its corresponding `BidirectionalBinding` implementations.
Such an interface could look like this: public interface ValueConverter<S, T> { T convert(S value); S convertBack(T value); } The public `Bindings` API would then be: public static <T, S> void bindBidirectional( Property<T> property1, Property<S> property2, ValueConverter<S, T> converter) For ease of use, some predefined converters could be added to a convenience class `ValueConverters`. Here's how this could be used in code: var p1 = new SimpleBooleanProperty(); var p2 = new SimpleBooleanProperty(); Bindings.bindBidirectional(p1, p2, ValueConverters.not()); var p3 = new SimpleDoubleProperty(); var p4 = new SimpleDoubleProperty(); Bindings.bindBidirectional(p3, p4, ValueConverters.add(5)); Am Do., 3. Juni 2021 um 22:33 Uhr schrieb Tobias Oelgarte <tobias.oelga...@gmail.com>: > > On 03.06.21 21:41, Michael Strauß wrote: > > Here's a simple thing I've come across frequently: > > > > Let's say you want to bidirectionally bind a CheckBox to a boolean > > property in a backend class (or any class that contains some kind of > > business logic). > > > > That's very easy, except if the backend property is worded in the > > "negative" (i.e. the frontend and backend values should be bound such > > that if one is true, the other is false). > > > > Since this is a very common scenario, I think it should be supported > > out-of-the-box in JavaFX by an addition to the > > `javafx.beans.binding.Bindings` class: > > > > public static void bindInverseBidirectional( > > Property<Boolean> property1, > > Property<Boolean> property2); > > > > The semantics for any two bound properties should be as follows: > > 1. If one property is `true`, the other property is `false`. > > 2. If one property is `null`, the other property is also `null`. > > > > Any thoughts? > > I had a similar need to create a bidirectional binding that could > additionally convert between two types. I came up with an utility class > that provides the following method: > > public static <A, B> void bindBidirectional( > Property<A> a, > Property<B> b, > Function<A, B> convertTo, > Function<B, A> convertFrom); > > See https://pastebin.com/uxjp30VH > > In your case one could simply write: > > bindBidirectional(a, b, a -> a == null ? null : !b, b -> b == null > ? null : !a); > > or even simpler without null handling: > > bindBidirectional(a, b, a -> !b, b -> !a); >