10

我有一个按钮

<Button 
      android:id="@+id/ButtonConnect"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="Disconnect"
      local:MvxBind="{'Click':{'Path':'DisconnectCommand'}}" />

我有一个命令

public IMvxCommand DisconnectCommand
{
    get
    {
        return new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect);
    }
}

然后我想启用/禁用 DisconnectCommand 使用

DisconnectCommand.CanExecute(this.GetService<IConnectionService>().UsbConnected);

但这显然是错误的(它不起作用),我将检查作为 aa 参数放入,但通常我会这样做

DisconnectCommand.CanExecute = someBool;

但是没有要设置的属性,那么该怎么做呢?

4

2 回答 2

8

要了解如何使用CanExecute,请查看 Silverlight 或 WPF - 有很多博客讨论如何使用ICommand- 例如http://weblogs.asp.net/nmarun/archive/2009/12/02/using -icommand-silverlight-4.aspxhttp://blog.galasoft.ch/archive/2009/09/26/using-relaycommands-in-silverlight-and-wpf.aspx

一个例子是这样的:

private MvxRelayCommand _disconnectCommand;
public IMvxCommand DisconnectCommand
{
    get
    {
        if (_disconnectCommand == null)
            _disconnectCommand = new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect, item => this.IsItemConnected(item));
        return _disconnectCommand;
    }
}

private void SomeServiceNotificationHandler()
{
    _disconnectCommand.RaisePropertyChanged();
}

private bool IsItemConnected(object thing)
{
    return /* your code */;
}

不过有一个小问题......

CanExecute并没有真正在所有平台上的所有 MvxBindings 上完全实现......它适用于其中一些,但对于其中一些它不会 - 我真的不知道目前哪些!如果您遇到问题,请让我知道(通过 GitHub 问题),他们会得到解决...


就个人而言......我不倾向于使用CanExecute- 我倾向于使用单独的布尔属性,然后我将其绑定到控件上可用的任何属性 - 例如,大多数控件都有类似Enabled, IsEnabled, Disabled,IsDisabled等的东西。

我通常发现设置布尔属性而不是调用更容易(并且更具可读性)RaiseCanExecuteChanged

例如我会使用类似的东西:

<Button 
  android:id="@+id/ButtonConnect"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="Disconnect"
  local:MvxBind="{'Click':{'Path':'DisconnectCommand'},'Enabled':{'Path':'UsbConnected'}}" />

您可以肯定地说该CanExecute方法具有优势 - 因为它将 Command 逻辑全部保存在一个对象中,并且因为它可用于防止ExecuteRelayCommand. CanExecute这就是为什么我很高兴在我们发现 mvvmcross 绑定时尝试修复它们。

于 2012-10-18T09:57:49.120 回答
5

为了跟进 Stuart 的回答,很容易同时支持同时ICommand.CanExecute公开属性以支持 Android 和 iOS Mvx 绑定。

为此,请将您的典型CanExecute() 方法转换为属性,然后将处理程序添加到对关联属性的CanExecuteChanged调用中。RaisePropertyChanged然后RaiseCanExecuteChanged正常使用,PropertyChanged事件也会被触发。

    ...

    // constructor
    public SomeClass()
    {

        DoSomethingCommand = new MvxCommand(OnDoSomething, () => CanDoSomething);
        DoSomethingCommand .CanExecuteChanged += (sender, args) => RaisePropertyChanged(() => CanDoSomething);
    }

    public bool CanDoSomething
    {
        get { ... }
    }

    ...
于 2013-08-23T17:45:00.153 回答