我在TextBox
中有一个xaml
我希望使用命令的CanExecute
选项进行验证。我在这里xaml
:
<UserControl.Resources>
<RoutedUICommand x:Key="CloseCommand" Text=""/>
<RoutedUICommand x:Key="NextCommand" Text=""/>
<RoutedUICommand x:Key="BackCommand" Text=""/>
</UserControl.Resources>
<UserControl.CommandBindings>
<CommandBinding Command="{StaticResource CloseCommand}" Executed="Close" />
<CommandBinding Command="{StaticResource NextCommand}" Executed="Next" CanExecute="OnCanExecute" />
<CommandBinding Command="{StaticResource BackCommand}" Executed="Back" />
</UserControl.CommandBindings>
这些是被调用的CommandBindings
,其中Next
命令与CanExecute
限制相关联。按钮看起来像这样:
<Button
DockPanel.Dock="Right"
Name="ButtonNext"
Margin="0,0,15,0"
Style="{DynamicResource NextButton}"
Command="{StaticResource NextCommand}">
</Button>
验证的.cs
:
private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = ValidateFields();
}
ValidateFields()
方法如下所示:
public bool ValidateFields()
{
if (string.IsNullOrEmpty(AutoCompleteBox.Text)) return false;
return IsValid(MyTextBox);
}
因此我的OnCanExecute
与TextBox
验证相关联。但是我遇到了问题。即使离开窗口写入此代码,我也注意到这个OnCanExecute
仍然被调用。
这是为什么?为什么我的OnCanExecute
被调用即使它不可见?
答案 0 :(得分:1)
NextCommand
是RoutedCommand
。
如果您查看implementation,您会注意到CanExecuteChanged
被触发时会CommandManager.RequerySuggested
被触发。
这将在许多情况下。我不确切知道,但它可能与鼠标移动或按下某个键(或其他用户交互)一样频繁!
你可以在你的Eventhandler中添加一个计数器变量来查看这种情况发生的频率。 如果您的RoutedCommand.CanExecute依赖于“代码隐藏”中的某些内容并且您没有移动鼠标,请按键或其他一些用户交互,但CanExecuteChanged可能不会触发,但它应该是。
如果你的CanExecute依赖于定期切换bool,你可以测试这个。