编程语言
首页 > 编程语言> > C#-CanExecute()返回true,并且按钮仍然被禁用

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