WPF Validating事件 替代办法。

来源:互联网 发布:c语言制表符 编辑:程序博客网 时间:2024/06/09 08:45

WPF 在Control控件上缺少 Validating事件 及 OnValidating虚函数。 需要在用户焦点 离开页面时,如果需要执行 “保存”操作,将会遇到问题。

以下是使用 “事件延迟” 的办法处理该问题:


IInputElement lastFouces; //一个临时变量


        protected override void OnPreviewLostKeyboardFocus(KeyboardFocusChangedEventArgs e)
        {
            System.Windows.Media.Visual atV = e.NewFocus as System.Windows.Media.Visual;
            if (atV != null && !this.IsAncestorOf(atV))
            {
                lastFouces = e.NewFocus;
                lastFouces.GotKeyboardFocus += new KeyboardFocusChangedEventHandler(NewFocus_GotKeyboardFocus);
            }
            base.OnPreviewLostKeyboardFocus(e);
        }


        void NewFocus_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            ((IInputElement)sender).GotKeyboardFocus -= new KeyboardFocusChangedEventHandler(NewFocus_GotKeyboardFocus);
            ((IInputElement)sender).GotKeyboardFocus -= new KeyboardFocusChangedEventHandler(NewFocus_GotKeyboardFocus);
            string error = CheckAndSavePage();  //  执行功能函数,返回错误信息。
            if (!string.IsNullOrEmpty(error))
            {
                MessageBoxResult aMR = MessageBox.Show(error + "\r\n是否继续?\r\n点击“是”放弃修改,点击“否”继续编辑。", "输入错误", MessageBoxButton.YesNo, MessageBoxImage.Error);
                if (aMR == MessageBoxResult.Yes)
                {
                    this.RefreshData(); // 刷新页面,重新绑定
                }
                else
                {
                    this.dgAra.Focus(); //继续停留在本页面, 如果lastFouces有焦点相关的事件处理函数,可能会出错。
                    return;
                }
            }
            else
            {
                this.RefreshData();
            }
        }