我有一个与这样的命令绑定的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的一些代码隐藏对我来说似乎没问题。
答案 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>
这解释了这个概念,并相应地修改它。