4

カスタムバインディングが必要で、いつどこでそれを実行できるかはわかりません。これは、カスタムバインディングのビューの関係です。コントロールのような*ビューについて考えてください。 ここに画像の説明を入力してください

ViewModel-> ContainerView-> FirstViewから接続していますが、TableViewに接続できません。ContainerViewをFirstViewに接続するために、カスタムバインディングを実行しました(今のところ一方向に)。そして、setvalueメソッドで、firstviewのメソッドSetBindingを呼び出します(ここでバインディングを実行します)

いくつかのオプションを試しましたが、何も起こりません。最後のオプションは次のようになります。

public GolferList CurrentGolferList { get; set; }
    public void SetBinding(GolferList golferList){
        this.CurrentGolferList = golferList;

        TableSource = new TableSourcePlayers(TableViewPlayers);
        var bindingDescription = new[]{
            new MvxBindingDescription {TargetName = "ItemsSource",SourcePropertyPath = "CurrentGolferList"} ,
        };

        Binder.Bind(this,TableSource, bindingDescription);

        TableViewPlayers.Source = TableSource;
        TableViewPlayers.ReloadData();

    }

別の扱い方を教えていただければ幸いです。

更新:私はスチュアートのリンクをたどりました、そして今それはうまくいきます、どうもスチュアートに感謝します!実際、私のスキームでは、TableViewはMvxSimpleBindableTableViewSourceであり、そこにデータをバインドしたいと思います。それで、それを機能させるために、私は以下のコードを使用しました(SetBindingはいくつかの外部リファクタリングを必要とします):

    private List<IMvxUpdateableBinding> bindings;
    private string BindingText = "{'ItemsSource':{'Path':'CurrentGolfers'}}";
   public object DataContext { 
        get { return dataContext; }
        set { dataContext = value;
            if (bindings == null)
                bindings = this.GetService<IMvxBinder>().Bind(dataContext, TableSource, BindingText).ToList();
            else
                bindings.ForEach(b => b.DataContext = dataContext);
           }
        }
    public void SetBinding(GolferList golferList){
        this.DataContext = PlayViewModel;
        tableView.Source = TableSource;
        tableView.ReloadData();
   }

BindingTextは、ビュー自体ではなく、テーブルを指していることに注意してください。

Update 2 V3では、少し異なります。まず、ビューはIMvxBindableとこのメンバーを実装する必要があります。

    public object DataContext
    {
        get { return BindingContext.DataContext; }
        set { BindingContext.DataContext = value; }
    }

    public IMvxBindingContext BindingContext { get; set; }

(BindingContext.ClearAllBindings()の呼び出しを破棄し、viewloadでCreateBindingContext()も呼び出すことを忘れないでください)

そして、クラスにバインドできるようになります。私の場合:

    var set = this.CreateBindingSet<FirstPlayViewController, PlayViewModel>();
    set.Bind(source).To(vm => vm.CurrentGolfers).Apply(); //I love the new fluent api :)
4

1 に答える 1

2

あなたがやりたいのは、カスタムバインディングではなく、実際のデータバインドビューだと思います。

これはこの質問でカバーされています-MvvmCrossTouchプロジェクトのカスタムバインド可能コントロール

基本的にあなたがする必要があるのはあなたのに'Bindings'と'DataContext'プロパティのコレクションを追加することですFirstView

これを行うと、通常のMvvmCrossビュー内で行うのと同じように、FirstView内で(DataContextに)データバインドできるようになります。

注-このタイプの操作を正確に支援するために「BindingContext」オブジェクトを追加したため、v3ではこれを行うのがはるかに簡単になります

于 2013-03-20T15:50:23.190 に答える