如果任何控件已更改WPF,则引发事件

时间:2013-06-14 08:09:33

标签: c# wpf validation wpf-controls

我想在我的WPF应用程序中进行make验证。我想要使​​用的方法是,如果我的控件的任何值已经更改,我想采取自定义操作。

我怎么能这样做,假设我有这样的控制

<TextBox x:Name="TextBox1" Text="{Binding Path=Box1,UpdateSourceTrigger=PropertyChanged}" />
<TextBox x:Name="TextBox2" Text="{Binding Path=Box2,UpdateSourceTrigger=PropertyChanged}" />

如果用户更改了该控件之一的值,我想创建自定义操作,例如(对于我的想法)

private void Window_Controls_Property_Changed(object sender,RoutedEventArgs e){
  if(((Control)sender)=="TextBox1")
    MessageBox.Show("Show message here of validation some control","Attention",MessageBoxButton.OK);
}

我仍然感到困惑的是将INotifyPropertyChangedValidationRule与我对MessageBox的显示错误结合起来。我仍然是使用这种功能的新手。

我看过很多关于INotifyPropertyChangedValidationRule的文章,但我仍然不知道如何像我之前所说的那样获得自定义操作。并且自定义验证可以使用另一个textbpx值来验证其他文本框。

有什么帮助?..

4 个答案:

答案 0 :(得分:1)

您可以在托管TextBox的Container上注册处理程序。像这样:

<StackPanel TextBox.LostFocus="TextBox_OnLostFocus">
    <TextBox x:Name="TextBox1" Text="{Binding Path=Box1,UpdateSourceTrigger=PropertyChanged}" />
    <TextBox x:Name="TextBox2" Text="{Binding Path=Box2,UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

这样,所有TextBox都将使用相同的处理程序,您可以查询e.Source以找出哪个TextBox触发了该事件。

答案 1 :(得分:0)

对于mvvm中的验证,您可以使用IDataErrorInfo。网上都有例子。

如果你真的想在视图模型中的属性发生变化时做一些特殊操作,你可以简单地订阅你自己的viewmodel PropertyChanged事件并处理你的东西

答案 2 :(得分:0)

您可能希望阅读有关BindingGroups和验证的this block post(以及此related blog post)。它们向您展示了如何使用自定义验证规则一次验证多个控件。

答案 3 :(得分:-1)

<TextBox HorizontalAlignment="Left" LostFocus="OnLostFocus"/>

这是一个简单的方法。使用WPF中的LostFocus事件进行验证

private void TextBox_LostFocus_1(object sender, RoutedEventArgs e) {
        var thisTextBox = (TextBox)sender;
        if (thisTextBox.Text == "") {
            MessageBox.Show("Validate!");
        }
    }