gpt4 book ai didi

c# - CanExecute() 返回 true 并且按钮仍然被禁用

转载 作者:行者123 更新时间:2023-11-30 16:08:38 25 4
gpt4 key购买 nike

我在 Windows Phone 特定页面中有一个 BottomAppBar.AppBarButton,它绑定(bind)到中继命令。代码、绑定(bind)和 View 模型实现在项目的其他页面上都以基本相同的方式使用,并且完全按照预期工作。

此特定场景中的问题是,即使在调用 .RaiseCanExecuteChanged() 方法后按钮仍然处于禁用状态,并且 CanExecute() 返回 true.

我最初认为这可能是由于通过属性更改手动引发通知的调用过多,因此收紧了我的代码部分,以便仅在需要时以及需要更改按钮时引发该方法地位。尽管如此,尽管 CanExecute() 返回 true,该按钮仍然处于禁用状态。如果我注释掉 CanExecute() 中的所有检查并默认为 true,按钮将按预期启用,并且在点击时会触发预期的 Execute() 函数,因此它似乎 RelayCommand 的初始化没问题。如果我随后让检查重新进入,并在每次触发 CanExecute() 时逐步运行,当它返回 true 时,按钮不会启用。

有什么想法吗?为了它的值(value),我在下面添加了代码,但我认为这不是原因。

RelayCommand 类是 VS 中 HubApp 自带的标准类,所以我将省略该代码。

View 模型构造函数的最后一行是 RelayCommand;

AddStrikeTeamCommand = new RelayCommand(async() => await AddStrikeTeam(), CanAddStrikeTeam);

可以添加是;

private bool CanAddStrikeTeam()
{
//if (NameWorking == string.Empty) return false;
//if (FactionWorking == string.Empty) return false;
//if (PointsLimitWorking < 1) return false;
//if (!IsValidTeamWorking) return false;
return true;
}

最后,按钮绑定(bind)

<AppBarButton x:Name="accept" Icon="Accept" Label="accept"
Command="{Binding AddStrikeTeamCommand}"/>

最佳答案

我敢打赌您的问题与 RaiseCanExecuteChanged() 有关。如果您习惯于 WPF 以及它如何为您自动刷新 CanExecute,则尤其如此。查看此委托(delegate)命令实现:

http://codepaste.net/ho9s5a

ICommand 接口(interface)定义了事件 CanExecuteChanged,它指示按钮(或 UI 元素)刷新其 Enabled 状态。在 WPF 中,这是由静态命令管理器不断引发的。这在 WinRT 中不存在。在 WPF 中,因为它被频繁引发,WPF 开发人员必须小心 CanExecute() 不是一个昂贵的操作。 WinRT 提供昂贵的测试,但因此需要开发人员手动引发事件。我希望这是有道理的。

我处理这个问题的一种方法是:

DelegateCommand _SaveCommand = null;
public DelegateCommand SaveCommand
{
get
{
if (_SaveCommand != null)
return _SaveCommand;
_SaveCommand = new DelegateCommand
(
() =>
{
// TODO
},
() => true
);
this.PropertyChanged += (s, e) => _SaveCommand.RaiseCanExecuteChanged();
return _SaveCommand;
}
}

这基本上是根据(通常在我的 View 模型中)中任何属性的更改来刷新 CanExecute。如果您对 ObservableCollection 中的模型有潜在的更改,这还不够,但这是整个事情的良好开端。

有可能您根本没有这个问题。并且您正在调用以引发事件,它正在返回 true,并且仍然无法正常工作。如果是这种情况,那只能是您的代码,因为命令适用于数以千计的应用程序。但是,如果你想把你的代码发给我,我会看看。

祝你好运!

关于c# - CanExecute() 返回 true 并且按钮仍然被禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28938761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com