2012-11-21 54 views
0

我有一个包含ListView和子项目(窗体控件)的Wicket Panel,但是当我按内部复选框时,某些子项目的可见性应该会更改。ListView中的组件不会更新AJAX刷新

但是,在AJAX更新期间重新绘制ListView后,调用WebMarkupContainer.setVisible(false)不会隐藏ListView中的项目。下面

代码:

public class ImagePanel extends Panel { 

private ArrayList<ImageEntry> imageEntryList; 

public class ImageEntry implements Serializable { 

    private static final long serialVersionUID = -3987685200930059655L; 

    public String thumbnail; 
    public String filename; 
    public boolean webDownloaded; 
    public WebMarkupContainer fileUpload; 
    public WebMarkupContainer webDownload; 
} 

public ImagePanel(String id) { 
    this(id, IMAGE_NORMAL); 
} 

public ImagePanel(String id, int type) { 
    super(id); 
    this.type = type; 

    wmc = new WebMarkupContainer ("wmc"); 
    wmc.setOutputMarkupId(true); 
    add(wmc); 

    imageEntryList = new ArrayList<ImageEntry>(); 
    ImageEntry imageEntry = new ImageEntry(); 
    imageEntry.thumbnail = "blah"; 
    imageEntry.filename = "blah"; 
    imageEntryList.add(imageEntry); 

    ListView<ImageEntry> llv = new LargeImageListView("large_image_list", imageEntryList); 
    wmc.add(llv); 

    SmallImageListView slv = new SmallImageListView("small_image_list", imageEntryList); 
    wmc.add(slv); 
} 

private final class SmallImageListView extends ListView<ImageEntry> { 

    private SmallImageListView(String id, List<? extends ImageEntry> list) { 
     super(id, list); 
    } 

    @Override 
    protected void populateItem(final ListItem<ImageEntry> item) { 

      ... 

     if (type == IMAGE_WIZARD) { 
      item.getModelObject().fileUpload = showWizardFileUpload(item); 
      item.getModelObject().webDownload = showWizardWebDownload(item); 
      showSortUpDown(item); 
      showWebCheckbox(item); 
     } 

    } 
} 


private void showWebCheckbox(final ListItem<ImageEntry> item) { 

    AjaxCheckBox checkbox = new AjaxCheckBox("use_web_image", new PropertyModel<Boolean>(item.getModelObject(), "webDownloaded")) { 

     public void onUpdate(AjaxRequestTarget target) { 

      if (getModelObject()) { 
       System.out.println("Show"); 
       item.getModelObject().fileUpload.setVisible(false); 
       item.getModelObject().webDownload.setVisible(false); 
      } else { 
       System.out.println("Hide"); 
       item.getModelObject().fileUpload.setVisible(false); 
       item.getModelObject().webDownload.setVisible(false); 
      } 

      target.add(wmc); 
     } 

    }; 

    item.add(checkbox); 
} 

    ... 

}

回答

2

使用ListView.setReuseItems(真),以确保ListView控件中的对象都正确序列化......否则,你每次都会获得不同的对象并且.setVisible()属性将被重置为默认值(例如'true')。

slv.setReuseItems(true); 
+1

除此之外,这就是为什么我更喜欢重写'isVisible()'。你当然要小心,不要做太多的处理,除了你的代码变得更干净和更容易阅读。 – biziclop

1

尝试

WebMarkupContainer.add(new AttributeModifier("style", new Model("display:none"))); 

WebMarkupContainer.add(new AttributeAppender("style", new Model("display:none"), "=")); 

代替。