Vaadin8 禁用Vaadin绑定

Vaadin8 禁用Vaadin绑定,vaadin8,Vaadin8,我有一个组件(例如文本字段),它将根据其他选择显示,例如单选按钮,当它被隐藏时,我不希望应用此字段上的绑定,因此 在某些地方: Binder binder = new Binder<SomeDTO>(SomeDTO.class); TextField conditionalComponet = TextField("A conditional component: "); binder.bind(conditionalComponet, "propertyX"); 我不想从布局中删

我有一个组件(例如文本字段),它将根据其他选择显示,例如单选按钮,当它被隐藏时,我不希望应用此字段上的绑定,因此

在某些地方:

Binder binder = new Binder<SomeDTO>(SomeDTO.class);
TextField conditionalComponet = TextField("A conditional component: ");
binder.bind(conditionalComponet, "propertyX");
我不想从布局中删除组件,因为将其放在相同的位置将是一个问题。我尝试了
setVisible(false)
setEnabled(false)
setReadOnly(true)
,但没有一个阻止绑定的应用。有没有一种简单的方法


我使用的是Vaadin 8。

据我所知,没有直接的方法可以阻止绑定器将值设置为绑定字段。尽管如此,通过使用bind(HasValue字段,)方法变量,您可以很容易地解决这个限制(?!)

对于示例,您可以查看下面的代码。请注意,它只是显示效果的基本部分,因此它没有所有的提示,例如禁用或重置带有复选框的雇用日期字段:

import com.vaadin.data.Binder;
导入com.vaadin.data.ValidationException;
导入com.vaadin.ui.*;
导入java.io.Serializable;
导入java.time.LocalDate;
公共类DisableBindingForField扩展了VerticalLayout{
私人最终用户=新用户(“黑暗用户”);
私有最终文本字段名称=新文本字段(“名称:”);
私有最终复选框isEmployed=新复选框(“isEmployed”);
私人最终日期字段dateOfEmployment=新日期字段(“雇用日期:”);
私人最终活页夹=新活页夹(个人等级);
私有最终按钮=新按钮(“保存”);
public DisableBindingForField(){
//分别手动绑定自定义字段(https://vaadin.com/docs/-/part/framework/datamodel/datamodel-forms.html -滚动到末尾)
bind(雇用日期,person->person.dateOfEmployment,(person,dateOfEmployment)->
//如果选中该复选框,则使用该值填充pojo,否则将pojo值重置为null
person.setDateOfEmployment((isEmployed.getValue())?雇用日期:null)
);
//自动绑定其余字段
binder.bindInstanceFields(本);
//bean的初始读取
binder.readBean(person);
//向用户界面添加组件
添加组件(名称、isEmployed、雇用日期、按钮);
//模拟“保存按钮”
按钮。添加ClickListener(事件->{
试一试{
活页夹、书写人(人);
Notification.show(person.toString());
}捕获(ValidationException e){
e、 printStackTrace();
}
});
}
//用于绑定的基本pojo
公共类Person实现可序列化{
私有字符串名称;
雇佣私人布尔运算;
私人雇佣日期;
公众人物(最终字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
public void setName(最终字符串名){
this.name=名称;
}
公共布尔值isEmployed(){
返回就业岗位;
}
使用公共void集合(使用布尔值){
已就业=已就业;
}
public LocalDate getDateOfEmployment(){
就业返回日期;
}
公共作废就业日期设置(本地就业日期){
this.dateOfEmployment=就业日期;
}
@凌驾
公共字符串toString(){
返回“Person{”+
“name=”+name+“\”+
“,isEmployed=“+isEmployed+
“,就业日期=“+就业日期”+
'}';
}
}
}
结果:

p.S.:可选的fluent builder样式:

binder.forField(雇用日期)
.bind(person->person.dateOfEmployment,(person,dateOfEmployment)->
//如果选中该复选框,则使用该值填充pojo,否则将pojo值重置为null
person.setDateOfEmployment((isEmployed.getValue())?雇用日期:null)
);

据我所知,没有直接的方法可以阻止绑定器将值设置为绑定字段。尽管如此,通过使用bind(HasValue字段,)方法变量,您可以很容易地解决这个限制(?!)

对于示例,您可以查看下面的代码。请注意,它只是显示效果的基本部分,因此它没有所有的提示,例如禁用或重置带有复选框的雇用日期字段:

import com.vaadin.data.Binder;
导入com.vaadin.data.ValidationException;
导入com.vaadin.ui.*;
导入java.io.Serializable;
导入java.time.LocalDate;
公共类DisableBindingForField扩展了VerticalLayout{
私人最终用户=新用户(“黑暗用户”);
私有最终文本字段名称=新文本字段(“名称:”);
私有最终复选框isEmployed=新复选框(“isEmployed”);
私人最终日期字段dateOfEmployment=新日期字段(“雇用日期:”);
私人最终活页夹=新活页夹(个人等级);
私有最终按钮=新按钮(“保存”);
public DisableBindingForField(){
//分别手动绑定自定义字段(https://vaadin.com/docs/-/part/framework/datamodel/datamodel-forms.html -滚动到末尾)
bind(雇用日期,person->person.dateOfEmployment,(person,dateOfEmployment)->
//如果选中该复选框,则使用该值填充pojo,否则将pojo值重置为null
person.setDateOfEmployment((isEmployed.getValue())?雇用日期:null)
);
//自动的
SomeDTO someDTO = new SomeDTO;
binder.writeBean(someDTO); //Here propertyX shouldn't be filled, i.e. bind should 
                       //not be applied, to propertyX of SomeDTO if the 
                       //conditionalComponet is hidden.
TextField usernameField;

binder.forField(this.usernameField)
    .bind(User::getUsername, User::setUsername);

binder.removeBinding(this.usernameField);