编程语言
首页 > 编程语言> > c# – 带有AccessText的wpf xaml按钮似乎不会查询CanExecute

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

作者:互联网

说明

>目标:在我的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); }

(IsNotBusy和OnNavToStoresSearch命令的代码工作正常,CanExecute UNTIL我添加了AccessText.)

解决方法:

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

XAML:

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

C#(ViewModel):

在构造函数中:

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

‘CanBrowse’财产:

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

我的猜测是你在RelayCommand上没有调用’RaiseCanExecuteChanged()’吗?

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

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

(进一步编辑)
我做了一些搜索,看起来你可以通过更改命名空间条目来调用’RaiseCanExecuteChanged’.更改…

using GalaSoft.MvvmLight.Command;

对于

using GalaSoft.MvvmLight.CommandWpf;

我迅速从我的测试应用程序中删除了“RaiseCanExecuteChanged()”代码,令人震惊的是它似乎正常工作.
也许这些年来我一直在做错…

标签:c,wpf,xaml,mvvm-light
来源: https://codeday.me/bug/20190701/1347976.html