2017-08-16 21 views
1

双方向モードでViewとViewModeの間に2つのカスタムプロパティをバインドする方法を理解できません。 まず、私は次のように同じのViewModelを持っている:Mvvmcrossカスタムプロパティ間の双方向バインド

//ViewModel 
    public class MyViewModel : MvxViewModel 
    { 
    .... 

    private MyMode _testA 

    public MyMode TestA 
    { 
     get => _testA; 
     set { 
      _testA = value; 
      RaisePropertyChanged(()=> TestA); 
      } 
    } 


     public MyViewModel() 
     { 
      TestA = MyMode.A; 
     } 

      ........ 
    } 

とビューに私は私のカスタムプロパティにバインドします:私はViewModelにに種皮を変更した場合

//View 
public partial class MyView : MvxViewController<MyViewModel> 
{ 

    public MyMode UiTestA 

    private void SetBiding() 
     { 
      var set = this.CreateBindingSet<MyView, MyViewModel>(); 
      set.Bind(this).For(x => x.UiTestA()).To(vm => vm.TestA); 
      set.Apply(); 
     } 

    private void SomeMethod() 
     { 
      var t1 = UiTestA; // t1 = MyMode.A; 
      UiTestA = MyMode.B; // Two way binding? 
      var t2 = ViewModel.TestA; // MyMode.A; 
     } 
} 

が、私はビューでこれを得ることができますが、IそれをViewで変更し、ViewModelで新しい値を探したいとします。

+0

、 VMプロパティが更新されなかった理由は、View側からの変更通知がトリガされなかったためです。あなたのVMではRaisePropertyChangedを使います。ビュー側で、以下のようにTargetBindingを作成します。 Mvxがすぐに使える理由は、TextやClickのようなものは、Mvxフレームワークで既に定義されているバインディングを持っているからです。 – Kiliman

答えて

0

デフォルトでは、MvvmCrossはすべてのパブリックプロパティをOneWayモードでバインドできます。 TwoWayモードを動作させるには、TargetからSourceへの設定が可能なTarget Bindingで作成する必要があります。これらをTargetBindingsと呼びます。

あなたのビューにはHelloという名前のプロパティとHelloChangedというイベントがあります。これら二つで手にあなたは、単純なTargetBinding作成することができます。

public class MyViewHelloTargetBinding 
    : MvxConvertingTargetBinding 
{ 
    protected MyView View => Target as MyView; 

    private bool _subscribed; 

    public MyViewHelloTargetBinding(MyView target) 
     : base(target) 
    { 
    } 

    private void HandleHelloChanged(object sender, EventArgs e) 
    { 
     var view = View; 
     if (view == null) return; 

     FireValueChanged(view.Hello); 
    } 

    public override MvxBindingMode DefaultMode = MvxBindingMode.TwoWay; 

    public override void SubscribeToEvents() 
    { 
     var target = View; 
     if (target == null) 
     { 
      MvxBindingTrace.Trace(MvxTraceLevel.Error, 
       "Error - MyView is null in MyViewHelloTargetBinding"); 
      return; 
     } 

     target.HelloChanged += HandleHelloChanged; 
     _subscribed = true; 
    } 

    public override Type TargetType => typeof(string); 

    protected override void SetValueImpl(object target, object value) 
    { 
     var view = (MyView)target; 
     if (view == null) return; 

     view.Hellp = (string)value; 
    } 

    protected override void Dispose(bool isDisposing) 
    { 
     base.Dispose(isDisposing); 
     if (isDisposing) 
     { 
      var target = View; 
      if (target != null && _subscribed) 
      { 
       target.HelloChanged -= HandleHelloChanged; 
       _subscribed = false; 
      } 
     } 
    } 
} 

を次に、あなただけのFillTargetFactoriesであなたのSetup.csのファイルに結合ターゲットを登録する必要があります。Cheesebaronは答えを明確にする

registry.RegisterCustomBindingFactory<MyView>(
    "Hello", view => new MyViewHelloTargetBinding(view)); 
関連する問題