ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-20 17:09:03  阅读:558  来源: 互联网

标签:win-universal-app winrt-xaml c


我在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有