FreshMvvm:Command.CanExecute只调用一次。我做错了什么?

时间:2018-03-03 15:42:56

标签: freshmvvm

当使用FreshMvvm制作Xamarin Forms应用时,我始终面临CanExecute Command方法仅被调用一次,而不再被调用的问题。因此,如果我最初不允许Command执行,我不能在以后允许它,反之亦然。肯定有一些我做错了。

我制作了一个小型测试应用程序来演示我的代码。 如果你能看一眼并指出我的错误,我将不胜感激。

该应用程序非常简单;只有一个屏幕,其中包含ButtonSwitch

  • 点击按钮应显示警告。
  • Switch应该切换是否启用了按钮。
  • Switch绑定到bool属性。
  • 按钮绑定到Command
  • Command的CanExecute方法返回Switch控制的bool属性的值。
  • 命令的Execute方法显示警报。
  • 在PageModel的init方法中,我将bool属性设置为false

我的MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:FreshCommandTrial01"
             x:Class="FreshCommandTrial01.Pages.MainPage">
    <ContentPage.Content>
            <StackLayout>
            <Button
                Text="Show Alert"
                Command="{Binding ShowAlertCommand}" />
            <Switch
                IsToggled="{Binding IsAlertAllowed}" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

我的MainPageModel.cs

using FreshMvvm;
using System.Diagnostics;
using Xamarin.Forms;

namespace FreshCommandTrial01.ViewModels
{
    public class MainPageModel : FreshBasePageModel
    {
        public override void Init(object initData)
        {
            IsAlertAllowed = false;
        }

        private bool _isAlertAllowed;
        public bool IsAlertAllowed
        {
            get { return _isAlertAllowed; }
            set
            {
                _isAlertAllowed = value;
                RaisePropertyChanged("IsAlertAllowed");
                ShowAlertCommand.ChangeCanExecute();
            }
        }

        public Command ShowAlertCommand
        {
            get
            {
                return new Command(
                  () => ShowAlertCommand_Execute(),
                  () => ShowAlertCommand_CanExecute()
                  );
            }
        }

        private bool ShowAlertCommand_CanExecute()
        {
            Debug.WriteLine("CanExecute called: IsAlertAllowed = " + IsAlertAllowed);
            return IsAlertAllowed;
        }

        private async void ShowAlertCommand_Execute()
        {
            await CoreMethods.DisplayAlert("Alert", "This is an alert", "OK");
        }
    }
}

预期行为

  • 启动应用程序后,Switch处于“关闭”位置,“按钮”处于禁用状态。

  • 当我将Switch切换到On位置时,再次调用Command的CanExecute方法,并启用Button。

已被观察的行为

  • [这没关系]启动应用后,Switch处于关闭位置,按钮被禁用。

  • [这不行]当我将Switch切换到On位置时,不会调用CanExecute,并且Button仍然处于禁用状态。

我将不胜感激任何帮助。谢谢!

0 个答案:

没有答案