c# - 如何将 CanExecute 与 Mvvmcross 一起使用

标签 c# data-binding xamarin.android mvvmcross

我有一个按钮

<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);

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

DisconnectCommand.CanExecute = someBool;

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

最佳答案

要了解如何使用 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 - 我倾向于使用一个单独的 bool 属性,然后我将其绑定(bind)到控件上可用的任何属性 - 例如大多数控件都有类似 EnabledIsEnabledDisabledIsDisabled 等内容。

我通常发现设置 bool 属性比调用 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 方法具有优势 - 因为它将命令逻辑全部保存在一个对象中,并且因为它可用于防止发生 Execute 调用在 RelayCommand 中。这就是为什么我很乐意尝试修复我们发现的 mvvmcross 绑定(bind)中的 CanExecute 错误。

关于c# - 如何将 CanExecute 与 Mvvmcross 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12951733/

相关文章:

c# - 关于在 C# 中优化代码以提高速度的几个问题

c# - WPF 设置窗口数据上下文

android - 使用数据绑定(bind)和 lambda 的单选按钮 onCheckedChanged

安卓模拟器不能用

java - Android Webview 有时无法呈现 pdf,而是显示空白/白页

c# - 在 C# 中的快捷方式后面复制文件

c# - TextFieldParser 忽略标题行 C#

json - Knockout.js 将 JSON 数组中的每个对象数据绑定(bind)到 <td>

c# - 使用 XPath 绑定(bind)表达式时,是否可以取回 InnerXml 而不是 InnerText?

android - System.InvalidCastException - 在调试中有效,在发布时失败