0

ではなく、Java クラスでデータ バインディングを使用したいと考えています。

@練る

Listboxの各ListCellで。私はこの例で試しました

私のZUlファイル...

<zk>
  <window border="normal" title="hello" apply="org.zkoss.bind.BindComposer"
        viewModel="@id('vm') @init('com.test.binding.TestRenderer')" >
     <button label="ClickMe" id="retrieve"
                        onClick="@command('onOK')">
                    </button>
    <div height="800px">
      <listbox model="@load(vm.model)" itemRenderer="@load(vm.itemRenderer)" vflex="true" multiple="true"/>
    </div>
  </window>
</zk>

私のJavaクラスまたはViewController.....

package com.test.binding;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.zk.ui.Component;
import org.zkoss.zkplus.databind.AnnotateDataBinder;
import org.zkoss.zkplus.databind.Binding;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Textbox;


public class TestRenderer {

    ListModelList model = new ListModelList();
    private AnnotateDataBinder binder;

    @AfterCompose
    public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
        binder = new AnnotateDataBinder(view);
     List persons = new ArrayList();    
     model.add(new Person("David", "Coverdale"));
     model.add(new Person("Doug", "Aldrich"));
     model.add(new Person("Reb", "Beach"));
     model.add(new Person("Michael", "Devin"));
     model.add(new Person("Brian", "Tichy"));


        binder.loadAll(); 


    }

    public void setModel(ListModelList model) {
        this.model = model;
    }

    public ListModel getModel() {

        return model;
    }

    // method for ZK 6
    public ListitemRenderer getItemRenderer() {
        ListitemRenderer _rowRenderer = null;
        if (_rowRenderer == null) {

            _rowRenderer = new ListitemRenderer() {
                public void render(final Listitem item,   Object object,
                        int index) throws Exception {
                    final Person dataBean = (Person) object;

                    binder.bindBean(item.getId() , dataBean);

                    Listcell cell = new Listcell();
                    Textbox name = new Textbox();
                    name.setValue(dataBean.getFirstName());
                    System.out.println(item.getId()+ "------------------>"+item.getId() + ".name");
                    //binder.addBinding(name, "value", item.getId()+i + ".name", null, null, "both", null, null, null, null);
                    //binder.addBinding(name, "value",item.getId() + ".name", new String[] {}, "none", "both", null);
                    cell.appendChild(name);
                    //cell.addAnnotation(cell, "bind", null);
                    cell.setParent(item);

                }
            };
            binder.saveAll();
            binder.loadAll();
        }
        return _rowRenderer;
    }
    @Command
    public void onOK() {
        binder.saveAll(); //load Inputfields from Form, Constraints will be performed

        binder.loadAll(); 
       Collection<Binding> test =  binder.getAllBindings();
        System.out.println(model);
      }
    public class Person {
        private String firstName;
        private String lastName;

        public Person(String fn, String ln) {
            setFirstName(fn);
            setLastName(ln);
        }

        public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String fn) {
            firstName = fn;
        }

        public String getLastName() {
            return lastName;
        }
        public void setLastName(String ln) {
            lastName = ln;
        }

    }

    @Command
     public void clickMe(){
        BindingListModelList blml =  (BindingListModelList) getModel();

        for (Object object : blml) {
          System.out.println(Integer.parseInt((String) object));
        }
    }
}

誰でも私にデモの例を教えてもらえますか

getItemRendered()

リストボックス内

ありがとう

4

3 に答える 3

3

あなたは異なるパラダイムを混ぜようとしています。特にMVVMスタイルのデータバインディングを使用したいだけでなく、その過程でカスタムレンダラーも導入したいと考えています。これが機能したとしても、それは非常に悪い習慣だと思います。ビューをモデルから分離し、ビューでバインディングのみを定義する純粋な MVVM データ バインディングを使用するか、純粋な MVC を使用して独自のレンダラーを使用してモデル データを必要に応じてレンダリングします。

データバインディングの要点は、バインダーがデータバインディング注釈に基づいてコンポーネントの状態のレンダリング/更新を処理できるようにすることです。

ここで使用しているサンプルコードについて具体的に話すorg.zkoss.bind.BindComposerと、バインダーインスタンスが自動的に初期化され、その後、別のインスタンスも明示的にインスタンス化さAnnotateDataBinderれる@AfterComposeため、これら2つの間に競合が発生します。

私の提案は、ビューに導入することで純粋な MVVM データバインディングを使用し、MVVM バインダーがまたは注釈<template>を使用してこのテンプレートをレンダリングできるようにするか、この「 Java の MVVM」記事で説明されているように純粋な Java スタイルの MVVM データバインディングを使用することです。@Bind@Load

于 2012-12-12T03:59:35.773 に答える
0

@サブボード

また、ListitemRenderer に EventListener を追加して、必要なデータを含むカスタム イベントをリストボックスに渡し、そのカスタム イベントを ViewModel にバインドすることもできます。github のサンプル プロジェクトオンラインのデモを参照してください。

編集:

私のブログの関連記事: ZK Listbox: Event Processing with Renderer and MVVM

于 2012-12-16T06:42:56.243 に答える
0

私の意見では、MVVM で ListitemRenderer を使用することはそれほど悪くはありません。zul ページと ViewModel の間の「ブリッジ」になることもあり、コンポーネントの一部と見なすこともできます (モデルを割り当てると、リストボックスはデフォルトのレンダラーを使用するため)テンプレートまたはカスタム レンダラーを割り当てない場合はアイテムをレンダリングします) (リスト モデルを参照)。デフォルトのレンダラーでモデルとレンダ アイテムのみを割り当てるのが悪いとすれば、レンダ アイテムにモデルとカスタム レンダラーの両方を割り当てるのが悪いことではありません。

最初に「良い」とは何かを定義しましょう: -- zul ファイルは、ViewModel がどのように機能するかを知る必要はありません。必要に応じてデータとトリガー コマンドを要求するだけです。-- ViewModel は zul ページで何も知る必要はありません。データを提供し、定義済みのイベントを処理するだけです。

ここで、公式ドキュメント: Performing Actions on Eventsで説明されているような単純なシナリオについて考えてみます。

この行を参照してください

onClick="@command('deleteOrder', cartItem=cartItem)"

そしてこの行

public void deleteOrder(@BindingParam("cartItem") CartItem cartItem)

この場合、zul ページは、イベントがトリガーされている間に param を deleteOrder コマンドに持ち込むことを知る必要があり、param が ViewModel で cartItem という名前の変数を割り当てる必要があることも知る必要があります。一方、ViewModel は zul ページから渡されたパラメーターを取得する必要があります。

これは明らかに「良い」状況ではありません。

ListitemRenderer (ShoppingcartOrderlistItemRenderer としましょう) を使用すると、必要なデータを含むイベントを Listbox (たとえば、onDeleteOrder) に投稿するだけで、次のようになります。

<listbox onDeleteOrder="@command('deleteOrder')" ...

public void deleteOrder(@ContextParam(ContextType.TRIGGER_EVENT) DeleteOrderEvent event) {
    getShoppingCart().remove(event.getProductId());
}

zul ページで定義されたパラメーターに依存するのではなく、イベントに依存します。これはより堅牢だと思います。

最後に、まだ個人的な意見を言わなければなりません。

于 2012-12-15T17:10:37.727 に答える