【问题标题】:does invokecommandaction use canexecute?invokecommandaction 使用可以执行吗?
【发布时间】:2013-07-16 16:41:04
【问题描述】:

我是 wpf 和交互性的新手。我正在尝试基于某些事件触发器执行命令。在下面的代码中,当触发双击事件时,调用 CanExecute 并返回 false,但仍调用执行函数。这是 invokecommandaction 的默认行为吗?我会认为当can execute返回false时,execute不会被调用。

<UserControl x:Class="..."
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDoubleClick">
        <i:InvokeCommandAction Command="{Binding Path=DisplayReportCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
...

【问题讨论】:

  • 是的,它确实使用了 canexecute,如果它返回 false,您的命令将不会被执行。我测试过了。

标签: wpf mvvm


【解决方案1】:

是的,它将使用canexecute,如果返回false,则不会执行命令。我已经发布了一个代码示例。

这是您的 ViewModel 类中的命令

RelayCommand _showMessageCommand;
public ICommand ShowMessageCommand
{
    get
    {
        if (_showMessageCommand == null)
        {
            _showMessageCommand = new RelayCommand(param => this.ShowMessage(), param => this.CanShowMessage);
        }
        return _showMessageCommand;
    }
}

public void ShowMessage()
{
    MessageBox.Show("Nitesh");
}

private bool CanShowMessage
{
    get
    {
        return false;    // Set to true to execute the command
    }
 }

这就是你将在 XAML 中使用它的方式

<Button Content="Nitesh">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding ShowMessageCommand}" ></i:InvokeCommandAction>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

【讨论】:

  • 根据本站:social.technet.microsoft.com/wiki/contents/articles/…"另外请注意,使用 InvokeCommandAction 不会根据命令的 CanExecute 方法自动启用或禁用控件,这与具有 Command 属性并且可以绑定的控件不同直接下达命令。”这似乎与你写的相矛盾。哪个是真的?
猜你喜欢
  • 2013-07-14
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多