禁用ToolbarItem Xamarin.Forms

Los*_*oon 18 c# xaml xamarin xamarin.forms

我的页面中有以下内容:

<ContentPage.ToolbarItems>
    <ToolbarItem Text="Run" Command="{Binding RunCommand}" />
</ContentPage.ToolbarItems>
Run Code Online (Sandbox Code Playgroud)

该命令启动异步任务.我试图禁用控件,只要异步任务仍在运行,方法是将它绑定到布尔属性,如下所示:

<ContentPage.ToolbarItems>
    <ToolbarItem Text="Run" Command="{Binding RunCommand}" IsEnabled="{Binding MyBoolProperty}" />
</ContentPage.ToolbarItems>
Run Code Online (Sandbox Code Playgroud)

我的问题是ToolbarItem似乎没有"IsEnabled"属性.有没有办法实现我尝试使用Xamarin.Forms做什么?

Los*_*oon 18

在William和Xamarin支持的帮助下,我终于能够找到功能如何工作.

我们希望启用/禁用按钮(ToolbarItem),这有点反直觉,但实际上我们必须管理绑定到按钮的命令的状态.一旦我们理解了这种模式,就有意义了.

ICommand类型的Command对象具有CanExecute属性(感谢William指出它)现在您不想直接访问/使用它,除非它实际检查命令是否可以执行.

只要您认为代码适合,要更改命令的状态,您需要添加以下行:

((Command)_myCommand).ChangeCanExecute();
Run Code Online (Sandbox Code Playgroud)

此行将强制为指定的命令重新评估CanExecute属性.

我个人决定将它添加到跟踪不活动的地方,因为它在我的应用程序中是有意义的.

public bool Inactive { 
    get { 
        return _inactive;
    } 
    set {
        if (_inactive != value) {
            _inactive = value;
            ((Command)_myCommand).ChangeCanExecute();
            OnPropertyChanged ();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在视图中,没有任何变化需要注意:

<ToolbarItem Text="Run" Command="{Binding MyCommand}" />
Run Code Online (Sandbox Code Playgroud)

现在,当您创建Command对象时,将完成大量工作.我们通常使用单个参数构造函数,因为它通常是足够的,它是我们定义命令的作用的地方.有趣的是,还有一个2参数构造函数,您可以在其中提供确定CanExecute属性值的函数/操作.

_myCommand = new Command (async () => {
                                          Inactive = false;
                                          await Run();
                                          Inactive = true;
                                      },
                                      () => {
                                          return Inactive;
                                      });


public ICommand MyCommand {
    get { 
        return _myCommand;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我知道你在技术上改变Inactive的值应该在Run()中发生,但出于演示目的......

  • 我的代码不适用于此示例.这真的禁用了按钮或只是避免执行代码?你有这个实现的完整样本吗?谢谢. (2认同)
  • 它同时执行(禁用按钮并避免执行)。你在什么平台?我已经在 iOS 和 Android 上进行了测试。另外,我知道有一个问题,当 ToolbarItem 的顺序设置为 Secondary 时,您看不到启用与否之间的区别,但如果禁用,代码仍然不会执行。 (2认同)