带有AccessText的wpf xaml按钮似乎不会查询CanExecute

时间:2018-01-09 13:43:47

标签: c# wpf xaml mvvm-light

解释

  • 目标:在我的wpf桌面应用程序中,我想将AccessText添加到一个按钮,该按钮绑定到一个命令,该命令具有一个谓词,用于评估窗口/控件是否繁忙,因此启用/禁用按钮。
  • 状态:按钮命令正常工作,并且在添加AccessText之前已正确启用。 (我正在使用MvvmLight来支持我的ICommand。)
  • 问题:添加AccessText后,命令仍然绑定,但CanExecute似乎不再被查询,并且按钮始终处于启用状态。 (我理想的解决方案就是没有代码隐藏XAML。)

实施例

XAML:

工作:

<Button Command="{Binding NavToStoresSearchCmd}" Content="Stores" Height="30"/>

不工作:

<Button Command="{Binding NavToStoresSearchCmd}" Height="30">
    <AccessText>S_tores</AccessText>
</Button>

C#(ViewModel):

public ICommand NavToStoresSearchCmd { get => new RelayCommand(OnNavToStoresSearch, () => IsNotBusy); }

IsNotBusyOnNavToStoresSearch命令的代码工作正常,CanExecute UNTIL 我添加AccessText。 )

1 个答案:

答案 0 :(得分:2)

刚刚对此进行了测试,它似乎按预期工作。 我的代码:

<强> XAML:

<Button Command="{Binding BrowseCommand}">
    <AccessText>_Browse</AccessText>
</Button>

C#(ViewModel):

在构造函数中:

BrowseCommand = new RelayCommand( BrowseCommandHandler, () => CanBrowse );

&#39; CanBrowse&#39;属性:

private bool _canBrowse;
public bool CanBrowse
{
    get { return _canBrowse; }
    set { _canBrowse = value; BrowseCommand.RaiseCanExecuteChanged(); }
}

我的猜测是你没有打电话&#39; RaiseCanExecuteChanged()&#39;你的RelayCommand?

(编辑:刚看到评论在我点击提交之前进来。抱歉伙计们!)

如评论中所述,此处需要 RaiseCanExecuteChanged 。 WPF的CommandManager在检测到UI更改,绑定更新,状态更改等时调用CanExecute。它是不可靠的。您可能很幸运,在早期的测试中,CommandManager对您的反应如何,但(在我看来)当您知道它已被更改时,明确调用RaiseCanExecuteChanged会更好。

(进一步编辑) 我做了一点搜索,看起来你可以绕过需要打电话&#39; RaiseCanExecuteChanged&#39;通过更改命名空间条目。变化...

using GalaSoft.MvvmLight.Command;

using GalaSoft.MvvmLight.CommandWpf;

我迅速撕掉了“RaiseCanExecuteChanged()&#39;从我的测试应用程序编码,令人震惊的似乎工作。 也许这些年来我一直在做错......