当使用FreshMvvm制作Xamarin Forms应用时,我始终面临CanExecute
Command
方法仅被调用一次,而不再被调用的问题。因此,如果我最初不允许Command
执行,我不能在以后允许它,反之亦然。肯定有一些我做错了。
我制作了一个小型测试应用程序来演示我的代码。 如果你能看一眼并指出我的错误,我将不胜感激。
该应用程序非常简单;只有一个屏幕,其中包含Button
和Switch
。
bool
属性。Command
。CanExecute
方法返回Switch控制的bool属性的值。Execute
方法显示警报。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仍然处于禁用状态。
我将不胜感激任何帮助。谢谢!