ExceptionValidationRule in "two way" and XmlParseV
本文关键字:quot and XmlParseV way two ExceptionValidationRule in | 更新日期: 2023-09-27 18:09:39
我有一个数据库中的数据WPF应用程序。我可以在我的应用程序中创建新的数据并保存到数据库,我可以从我的数据库中加载数据。
例如,我创建了一个Person类。
在我的WPF应用程序中,我可以创建一个人,并拥有数据库。当我创建客户端时,一些文本框使用ExceptionValidationRule进行验证,并且,如果验证为false,则显示带有详细错误的标签,一切正常:)
我的问题很简单:在我的应用程序启动时,在我的MainWindow()中,我得到我所有的Person对象在我的数据库中,并将其加载到DataGrid中。
当我加载"Person对象"时,将调用验证(因为验证过程在set()函数中),并且,如果出现错误,
throw new ApplicationException(....)
没有扔!我有异常错误(XmlParseValidationException)消息,而不是说错误的标签。
只有当数据被加载到Person对象中时才会这样。
所以,总结:
如果我在绑定到Person对象的文本框中输入了错误的数据,如果验证为false,则一切正常,我看到错误标签:)
如果我从数据库加载坏数据到Person对象,如果验证为假,则异常消息框出现在我的屏幕上!
我的XAML:
<TextBox Name="TextBox_CodePerson" TabIndex="1" Grid.Column="1" VerticalAlignment="Center" Height="20">
<TextBox.Text>
<Binding Path="strCodePerson" >
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock Margin="50,0,0,0" DockPanel.Dock="Right"
Foreground="Red"
FontSize="10pt"
Text="{Binding ElementName=MyAdorner,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
</TextBlock>
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder Name="MyAdorner" />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这是我的Person类(为更好的视图清理):
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调试器中未检查未处理异常)。
EDIT:如果我加载我的数据从数据库到我的可观察集合上的Windows_load事件,我没有bug,但是,异常"停止"LoadDataInObservableCollection函数,所以结果是一个空的数据网格。
Some dsm:
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<Evenement> Collection_Evenements = new ObservableCollection<Evenement>();
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;
}
谢谢你:)
EDIT:如果我使用自定义验证器类,它OK !
只是一个问题,为了强制验证测试,我需要这样做,当我选择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;
如果我删除这两行,由于绑定,文本框被正确初始化,但没有调用验证过程。为什么?是否有一种方法可以强制验证过程并使用完整的绑定,而不需要:
TextBox_Code.Text = item.strCode;
TextBox_Name.Text = item.strName;
谢谢:)
Nixeus
在Window.Loaded
事件中初始化对象,而不是在构造函数中初始化。当Xaml构造你的对象时,你不能正确地对异常作出反应。