- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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)命令实现:
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/
我是一名优秀的程序员,十分优秀!