【问题标题】:wpf xaml button with AccessText seems not to query CanExecute带有 AccessText 的 wpf xaml 按钮似乎不查询 CanExecute
【发布时间】:2018-01-09 13:43:46
【问题描述】:

说明

  • 目标: 在我的 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#(视图模型):

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

IsNotBusyOnNavToStoresSearch 命令的代码可以正常工作,CanExecute 也是如此直到我添加了AccessText。)

【问题讨论】:

  • 我看不到你在哪里打电话RaiseCanExecuteChanged
  • 很确定 RaiseCanExecuteChanged 是 MvvmLight 的一部分。另外,我的代码在添加 AccessText 之前就可以工作,这让我觉得它被调用了。
  • 该命令是否在没有 AccessText 的情况下实际执行,因此,例如,如果您在 OnNavStoresSearch 中设置断点并单击按钮,它会被命中吗?在 getter 中创建 new RelayCommand 对我来说似乎有点奇怪,我通常希望在构造函数中创建一个实例然后使用(并且应该如上所述调用 RaiseCanExecuteChanged)。
  • 问题没有重现。虽然按钮上的铭文是黑色的,但是按钮不可用,命令没有执行

标签: c# wpf xaml mvvm-light


【解决方案1】:

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

XAML:

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

C#(视图模型):

在构造函数中:

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

'CanBrowse' 属性:

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

我猜你没有在 RelayCommand 上调用“RaiseCanExecuteChanged()”?

(编辑:刚刚看到 cmets 在我点击提交之前进来了。对不起,伙计们!)

正如 cmets 中所说,这里需要 RaiseCanExecuteChanged。 WPF 的 CommandManager 在检测到 UI 更改时调用 CanExecute,例如绑定更新、状态更改等。它是不可靠的。您可能很幸运在之前测试 CommandManager 如何为您做出反应,但是(在我看来)当您知道它已更改时,最好显式调用 RaiseCanExecuteChanged。

(进一步编辑) 我快速搜索了一下,看来您可以通过更改命名空间条目来解决需要调用“RaiseCanExecuteChanged”的问题。改变...

using GalaSoft.MvvmLight.Command;

using GalaSoft.MvvmLight.CommandWpf;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多