“双向”和XmlParseValidationException中的ExceptionValidationRule

我有一个数据库中的数据的WPF应用程序。 我可以在我的Appli中创建新数据并保存到数据库,我可以从我的DataBase加载数据。

例如,我创建了一个Person类。

在我的WPF应用程序中,我可以创建一个Person和ave到DataBase。 当我创建一个客户端时,一些文本框是带有ExceptionValidationRule的,并且,如果validation为false,它会出现一个带有详细错误的标签,一切正常:)

我的问题非常简单:在我的App Lauching中,在我的MainWindow()中,我在DataBase中获取所有Person对象并在DataGrid中加载它。

当我加载“Person对象”时,调用validation(因为validation过程是set()函数),如果有错误,

throw new ApplicationException(....) 

不是扔! 我有exception错误(XmlParseValidationException)消息,而不是说出错误的标签。

只有当数据加载到Person对象中时才会这样。

所以,得出结论:

如果我在文本框中输入绑定到Person对象的错误数据,如果validation为false,一切正常,我看到错误标签:)

如果我将数据库中的错误数据加载到Person对象,如果validation为false,则我的屏幕上会出现exception消息框!

这是我的XAML:

          

                 

这是我的Person Class(为了更好的视图而清理):

  private string m_strCodePerson; public string strCodePerson { get { return m_strCodePerson; } set { m_strCodePerson = value; if (m_strCodePerson.Trim() != "") { if (m_objIntervenant.ReadIntervenantCodebyCode(m_strCodePerson) != 0) { throw new ApplicationException(m_strCodePerson.Trim() + " don't exist !"); } FirePropertyChangedEvent("strCodePerson"); } else { m_objIntervenant.strNom = ""; m_objIntervenant.strIntervenant = ""; } FirePropertyChangedEvent("objIntervenant.strNom"); } } 

有人有想法吗? (我在调试或发布模式下测试我的代码,我在VS 2012调试器中取消选中Unhandlded Exception)。

编辑 :如果我在Windows_load事件上将我的数据从数据库加载到我的Observable集合,我没有错误,但是,exception“停止” LoadDataInObservableCollection函数,因此结果是一个空数据网格。

一些特效:

  private void Window_Loaded_1(object sender, RoutedEventArgs e) { // //Fenetre_Parametres param = new Fenetre_Parametres(); //param.ShowDialog(); // LoadDataInObservableCollection(); myDataGridEvenements.Focus(); myDataGridEvenements.SelectedIndex = 0; myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); Lbl_CliCodeCliDes.Content = App.obj_myClient.m_strCode.Trim() + " - " + App.obj_myClient.m_strNom.Trim(); Lbl_CliCPostalVille.Content = App.obj_myClient.m_strCodePostal.Trim() + " - " + App.obj_myClient.m_strVille.Trim(); App.obj_Parametres.LoadDataGridParams(myDataGridEvenements); } 

这是我的LoadDataInObservableCollection函数:

  public ObservableCollection Collection_Evenements = new ObservableCollection(); Evenement myEvenement = new Evenement(); private void LoadDataInObservableCollection() { Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode); Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged; myDataGridEvenements.ItemsSource = Collection_Evenements; } 

非常感谢 :)

编辑:如果我使用自定义validation器类,它没关系!

只是一个问题,为了强制进行validation测试,当我在DataGrid中选择行时,我需要这样做:

  private void myDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { // Affiche le code évt sélectionné dans le tableau, dans les champs modifiable ( en haut de l'écran ) var item = myDataGrid.SelectedItem as Client; if ((item != null)) { TextBox_Code.Text = item.strCode; TextBox_Name.Text = item.strName; } } 

 TextBox_Code.Text = item.strCode; TextBox_Name.Text = item.strName; 

如果我删除这两行,则由于绑定而对文本框进行了核心初始化,但未调用validation过程。 为什么? 有没有办法强制validation过程并使用完整绑定whitout:

 TextBox_Code.Text = item.strCode; TextBox_Name.Text = item.strName; 

谢谢 :)

Nixeus

Window.Loaded事件中初始化对象,而不是构造函数。 当Xaml构造对象时,您无法正确响应exception。