2017-02-07 1 views
0

Je suis en train de créer un binded BigDecimal propriété qui est un calcul de deux autres BigDecimal properites, comme ceci:Dans TornadoFX, comment lier les propriétés BigDecimal à une autre propriété BigDecimal à l'aide de objectBinding?

val caculatedProperty: ObjectProperty<BigDecimal> = objectBinding<Any, BigDecimal>(sumProperty, discountProperty) { ... } 

... comme je le ferais avec StringProperty ou IntegerProperty, et il serait par ailleurs travailler sans problèmes. Cependant, cette fois je reçois une incompatibilité de type: il attend ObjectProperty<BigDecimal>, mais reçoit ObjectBinding<BigDecimal?>.

Quel est le problème ici? Ai-je mal utilisé la méthode objectProperty()? Dois-je utiliser une autre méthode pour créer une liaison d'un objet personnalisé?

EDIT:

La question était que je tentais de passer outre la ObjectProperty<BigDecimal> de classe parente avec ObjectBinding<BigDecimal>. La solution, dans mon cas, était de rendre le résumé original ObjectProperty<BigDecimal>, et de laisser l'implémentation aux classes qui l'héritent.

Répondre

0

Toutes les fonctions xBinding renvoient des liaisons et non des propriétés. Si vous y réfléchissez, comment une propriété calculée se comporterait-elle si elle était accessible en écriture? Devrait-il réécrire dans les propriétés sous-jacentes peut-être? TornadoFX prend également en charge ces types de propriétés proxy, mais je suppose que ce n'est pas ce que vous recherchez.

Vous vous demandez pourquoi vous obtenez ObjectBinding<BigDecimal?> au lieu de ?

La raison est que la propriété sous-jacente peut être nulle, et si tel est le cas, nous pourrions également vouloir renvoyer une valeur nulle de la liaison calculée.

Cela ne pose normalement pas de problème, la propriété est toujours observable et porte la valeur BigDecimal calculée correcte.

+0

Existe-t-il un moyen de créer une propriété (peut-être en lecture seule) à partir d'une liaison? Je veux utiliser mes liaisons dans le ItemViewModel, mais je ne peux pas utiliser 'bind {}' car c'est un 'Binding', pas un' Property' ... –

+0

J'ai utilisé 'ReadOnlyObjectWrapper' pour transformer une liaison en' ' ReadOnlyObjectProperty'. Y a-t-il un meilleur moyen? –

+0

Question intéressante en effet. Je vais regarder cela pendant le week-end et revenir à vous :) –