MVVMCross:Binding Two Way不会更新viewmodel

时间:2014-04-28 17:16:15

标签: android binding xamarin mvvmcross

我试图在Xamarin.Android项目中绑定自定义控件中的属性。

public class MyControl : RelativeLayout
{
    public ObservableCollection<string> MyProperty { get; set; }
}

在ViewModel端更新MyProperty时,它会更新View中的MyProperty。但是,如果我在视图中更新MyProperty(我希望在ViewModel中获取更新的值),则不会发生任何事情。

绑定:

public class MyControlMyPropertyTargetBinding : MvxAndroidTargetBinding
{
    private bool _subscribed;

    protected MyControl MyControl
    {
        get { return (MyControl)Target; }
    }


    public MyControlMyPropertyTargetBinding(MyControl target)
        : base(target)
    {
    }

    protected override void SetValueImpl(object target, object value)
    {
        var myControl = (MyControl)target;
        myControl.MyProperty = (ObservableCollection<string>)value;
    }


    public override Type TargetType
    {
        get { return typeof(ObservableCollection<string>); }
    }


    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.TwoWay; }
    }

    public override void SubscribeToEvents()
    {
        base.SubscribeToEvents();
        var myControl = MyControl;
        if (myControl == null || myControl.MyProperty == null)
            return;

        myControl.MyProperty.CollectionChanged += MyPropertyOnCollectionChanged;
        _subscribed = true;
    }

    private void MyPropertyOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
    {
        FireValueChanged(MyControl.MyProperty);
    }

    protected override void Dispose(bool isDisposing)
    {
        base.Dispose(isDisposing);
        if (isDisposing)
        {
            var myControl = MyControl;
            if (myControl != null && myControl.MyProperty!= null && _subscribed)
            {
                myControl.MyProperty.CollectionChanged -= MyPropertyOnCollectionChanged;
                _subscribed = false;
            }
        }
    }
}

Setup.cs:

protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
    registry.RegisterCustomBindingFactory<MyControl>("MyProperty", myProperty => new MyControlMyPropertyTargetBinding(myProperty));
}

protected override IList<Assembly> AndroidViewAssemblies
{
    get
    {
        var assemblies = base.AndroidViewAssemblies;
        assemblies.Add(typeof(MyControl).Assembly);
        return assemblies;
    }
}

更新: Windows Phone上绑定的相同控件完全可以双向运行。控件本身就是外部参考。

有人知道我错过了什么吗?

编辑1:我更新了目标绑定,收集更改了订阅但没有触发任何内容。 ObservableCollection由代码以编程方式更新,而不是由用户输入更新。

0 个答案:

没有答案