C#-CanExecute()返回true,并且按钮仍然被禁用
作者:互联网
我在Windows Phone特定页面中有一个BottomAppBar.AppBarButton,它绑定到中继命令.代码,绑定和viewmodel的实现在项目的其他页面上都以基本上相同的方式使用,并且完全按预期运行.
在这种特定情况下的问题是,即使在提高.RaiseCanExecuteChanged()方法之后,该按钮仍保持禁用状态,并且CanExecute()返回true.
我原本以为这可能是由于过多的调用而导致的,这些调用是通过手动更改属性更改来手动引发通知的,所以收紧了我那部分代码,以便仅在需要时以及在需要更改按钮状态时才引发该方法.即使CanExecute()返回true,该按钮仍保持禁用状态.
如果我注释掉CanExecute()中的所有检查并将其默认设置为true,则该按钮将按预期启用,并且在点按时会触发预期的Execute()函数,因此似乎可以执行RelayCommand的初始化.如果我然后放回检查,并在每次触发CanExecute()时逐步执行操作,则当它返回true时,该按钮不会启用.
有任何想法吗?对于它的价值,我在下面添加了代码,但我不认为这是原因.
RelayCommand类是VS中HubApp随附的标准类,因此我将省略该代码.
viewmodel构造函数的最后一行是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;
}
最后,按钮绑定
<AppBarButton x:Name="accept" Icon="Accept" Label="accept"
Command="{Binding AddStrikeTeamCommand}"/>
解决方法:
我知道这是一个较晚的答案,但此帖子已链接到另一个问题,因此我觉得我应该发布一个更好的代码示例.
Jerry’s answer最有可能是正确的,问题是在该ICommand实现中不会自动引发RaiseCanExecuteChanged,但是提供的代码示例重新引入了导致该错误首先出现的相同问题-每当有任何属性时,它都会引发CanExecuteChanged更改,导致CanExecute的调用远远超出了必要.
PropertyChanged事件处理程序应包括一个检查,并且如果更改的属性是CanExecute中使用的属性,则仅引发CanExecuteChanged.
由于您的CanExecute是
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;
}
那么事件处理程序仅在属性之一更改时才需要引发CanExecuteChanged
this.PropertyChanged += (s, e) =>
{
switch (e.PropertyName)
{
case "NameWorking":
case "FactionWorking":
case "PointsLimitWorking":
case "IsValidTeamWorking":
AddStrikeTeamCommand.RaiseCanExecuteChanged();
break;
}
}
标签:win-universal-app,winrt-xaml,c 来源: https://codeday.me/bug/20191120/2045461.html