将视图绑定到ICommand.CanExecute

时间:2013-12-04 08:36:01

标签: mvvmcross

以某种方式可以将视图属性绑定到ICommand.CanExecute吗?

我希望能够在触摸视图中执行类似的操作:

this
    .CreateBinding(SignInWithFacebookButton)
    .For(b => b.Enabled)
    .To((SignInViewModel vm) => vm.SignInWithFacebookCommand.CanExecute)
    .Apply();

我已经阅读了How to use CanExecute with Mvvmcross,但遗憾的是它会跳过问题而只是提出另一种实施方式。

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是使用您自己的继承自UIButton的自定义按钮。

对于Android,我已经实现了这一点 - 它是:

public class FullButton : Button
{
    protected FullButton(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
        Click += OnClick;
    }

    public FullButton(Context context) : base(context)
    {
        Click += OnClick;
    }

    public FullButton(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        Click += OnClick;
    }

    public FullButton(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {
        Click += OnClick;
    }

    private IDisposable _subscription;

    private object _commandParameter;
    public object CommandParameter
    {
        get { return _commandParameter; }
        set
        {
            _commandParameter = value;
            UpdateEnabled();
        }
    }

    private ICommand _command;
    public ICommand Command
    {
        get { return _command; }
        set
        {
            if (_subscription != null)
            {
                _subscription.Dispose();
                _subscription = null;
            }

            _command = value;

            if (_command != null)
            {

                var cec = typeof (ICommand).GetEvent("CanExecuteChanged");
                _subscription = cec.WeakSubscribe(_command, (s, e) =>
                    {
                        UpdateEnabled();
                    });
            }

            UpdateEnabled();
        }
    }

    private void OnClick(object sender, EventArgs eventArgs)
    {
        if (Command == null)
            return;

        if (Command.CanExecute(CommandParameter))
            Command.Execute(CommandParameter);
    }

    private void UpdateEnabled()
    {
        Enabled = ShouldBeEnabled();
    }

    private bool ShouldBeEnabled()
    {
        if (_command == null)
            return false;

        return _command.CanExecute(CommandParameter);
    }
}

,这可以绑定为:

<FullButton
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Show Detail"
    local:MvxBind="Command ShowDetailCommand; CommandParameter CurrentItem" />

对于iOS,我希望使用相同类型的技术...继承UIButton并使用TouchUpInside代替Click - 但我&#39;我担心此刻我还没有这个代码。