我的OnCanExecute事件反复发生

时间:2015-06-26 07:27:05

标签: wpf xaml

我在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);
 }

因此我的OnCanExecuteTextBox验证相关联。但是我遇到了问题。即使离开窗口写入此代码,我也注意到这个OnCanExecute仍然被调用。

这是为什么?为什么我的OnCanExecute被调用即使它不可见?

1 个答案:

答案 0 :(得分:1)

NextCommandRoutedCommand。 如果您查看implementation,您会注意到CanExecuteChanged被触发时会CommandManager.RequerySuggested被触发。 这将在许多情况下。我不确切知道,但它可能与鼠标移动或按下某个键(或其他用户交互)一样频繁!

你可以在你的Eventhandler中添加一个计数器变量来查看这种情况发生的频率。 如果您的RoutedCommand.CanExecute依赖于“代码隐藏”中的某些内容并且您没有移动鼠标,请按键或其他一些用户交互,但CanExecuteChanged可能不会触发,但它应该是。

如果你的CanExecute依赖于定期切换bool,你可以测试这个。