通知用户无法执行命令

时间:2016-10-05 08:28:03

标签: c# wpf mvvm canexecute

我有一个与这样的命令绑定的TextBox:

<TextBox Text="{Binding Path=TextContent, UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Command="{Binding Path=MyCommand}" Key="Enter" />
        </TextBox.InputBindings>
</TextBox>

属性TextContent是ViewModel中定义的字符串。命令MyCommand也在ViewModel中定义。 ViewModel不知道View。

只要TextBox具有焦点并且按下回车键,就会调用该命令。不幸的是,如果CanExecute返回false,则用户无法(在视觉上)看到该命令未被执行,因为TextBox中没有视觉上的变化。

我正在寻找有关如何向用户显示在按下回车后无法执行命令的建议。

我的想法(以及我对它们的怀疑):

  • CanExecute返回false时禁用TextBox:这不是选项,因为CanExecute的返回值可以在每次输入/更改字母时更改(文本中的文本) TextBox影响CanExecute)的结果。当它第一次被禁用时,用户不能再输入它,因此它将永远保持禁用状态。

  • 显示一个消息框,指出该命令未执行:请记住,ViewModel不知道View。 甚至可以从ViewModel打开一个消息框吗?此外,我应该在何处拨打电话打开消息框?不在CanExecute内,因为我只想在输入后获取消息框,而不是每次CanExecute都返回false。也许make CanExecute总是返回true并在Execute内进行检查:如果检查没问题,请执行命令,如果没有,则向用户显示一些消息。但是,CanExecute完全错过了......

我想保留MVVM,但是将一些东西重定向到ViewModel的一些代码隐藏对我来说似乎没问题。

2 个答案:

答案 0 :(得分:1)

我建议采用以下解决方案。

以下是如何通知用户我当前正在处理的内容的示例。

我希望用户输入int,double或string类型的数据限制。 它想检查用户输入的类型是否正确。 我使用属性 ValidateLimits 来检查字符串 MyLimits ,在您的情况下 TextContent

每次用户输入TextBox中的任何内容时,ValidateLimits都会检查字符串。如果它不是文本框中的有效字符串,则返回false,否则返回true。 如果为false,则使用DataTrigger通过在TextBox上设置一些属性来突出显示它,在我的例子中是一些Border和Foreground颜色,也是一个ToolTip。

同样在您的情况下,您希望在 CanExecute 方法中调用Validate方法。

如果您已经有一个检查命令是否正常的函数,那么只需将其添加到DataTrigger绑定。

<TextBox Text="{Binding MyLimit1, UpdateSourceTrigger=PropertyChanged}" Margin="-6,0,-6,0">
  <TextBox.Style>
    <Style TargetType="TextBox">
     <!-- Properties that needs to be changed with the data trigger cannot be set outside the style. Default values needs to be set inside the style -->
     <Setter Property="ToolTip" Value="{Binding FriendlyCompareRule}"/>
       <Style.Triggers>
         <DataTrigger Binding="{Binding ValidateLimits}" Value="false">
           <Setter Property="Foreground" Value="Red"/>
           <Setter Property="BorderBrush" Value="Red"/>
           <Setter Property="BorderThickness" Value="2"/>
           <Setter Property="ToolTip" Value="Cannot parse value to correct data type"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBox.Style>

public bool ValidateLimits
{
  get
  {
    // Check if MyLimit1 is correct data type
    return true/false;
  }
}

答案 1 :(得分:0)

bool IsCommandExecuted课程中使用媒体资源Command。相应地设置此属性。

使用ToolTip并将其IsOpen属性绑定到IsCommandExecuted属性,如下所示:

<TextBox ...>
    <TextBox.ToolTip>
        <ToolTip IsOpen="{Binding MyCommand.IsCommandExecuted}">...</ToolTip>
    </TextBox.ToolTip>
</TextBox>

这解释了这个概念,并相应地修改它。