C# 应用程序启动时ValidationError上的XamlParseException
我创建了一个WPF应用程序,其中绑定了一些文本框。 我使用验证错误来检查值是否正确。验证程序搜索数据库,以查看输入的数据是否存在 如果输入的值为false,则验证错误会捕获错误whitot问题:) 然而,如果我输入了一个好的值,如果我关闭我的应用程序,继续我的数据库删除该值,当我重新启动我的应用程序时,会加载最新的数据,这里…我有一个很好的崩溃:“XamlParseException” 此异常是因为我删除了数据中的一个值,并且在验证查找我的数据库时,找不到该数据 我不明白为什么我在发射时会坠毁,但不是在发射后 以下是我的验证示例:C# 应用程序启动时ValidationError上的XamlParseException,c#,wpf,xaml,data-binding,validation,C#,Wpf,Xaml,Data Binding,Validation,我创建了一个WPF应用程序,其中绑定了一些文本框。 我使用验证错误来检查值是否正确。验证程序搜索数据库,以查看输入的数据是否存在 如果输入的值为false,则验证错误会捕获错误whitot问题:) 然而,如果我输入了一个好的值,如果我关闭我的应用程序,继续我的数据库删除该值,当我重新启动我的应用程序时,会加载最新的数据,这里…我有一个很好的崩溃:“XamlParseException” 此异常是因为我删除了数据中的一个值,并且在验证查找我的数据库时,找不到该数据 我不明白为什么我在发射时会坠毁,
private string m_strCodeIntervenant;
public string strCodeIntervenant
{
get { return m_strCodeIntervenant; }
set
{
m_strCodeIntervenant = value;
if (m_strCodeIntervenant.Trim() != "")
{
if (m_objIntervenant.ReadIntervenantCodebyCode(m_strCodeIntervenant) != 0)
{
throw new ApplicationException(m_strCodeIntervenant.Trim() + " don't exist !");
}
FirePropertyChangedEvent("strCodeIntervenant");
}
else
{
m_objIntervenant.strNom = "";
m_objIntervenant.strIntervenant = "";
}
FirePropertyChangedEvent("objIntervenant.strNom");
}
}
public partial class MainWindow : Window
{
private void InitialiserControles()
{
TextBox_Description.Text = string.Empty;
TextBox_EvtNum.Text = string.Empty;
TimePicker_Heure.Value = null;
TextBox_Intervenant.Text = string.Empty;
TextBox_TypeEvenement.Text = string.Empty;
TextBloc_Note.Text = string.Empty;
DateTimePicker_Date.SelectedDate = DateTime.Today;
DateTimePicker_Relance.SelectedDate = null ;
}
public ObservableCollection<Evenement> Collection_Evenements = new ObservableCollection<Evenement>();
Evenement myEvenement = new Evenement();
private void MettreAJourTableauEvenements()
{
Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
myDataGridEvenements.ItemsSource = Collection_Evenements;
}
public MainWindow()
{
InitializeComponent();
this.DataContext = App.obj_myEvenement;
//Load Evenement in DataGrid
MettreAJourTableauEvenements();
}
private void myDataGridEvenements_SelectedCellsChanged_1(object sender, SelectedCellsChangedEventArgs e)
{
// Affiche le code évt sélectionné dans le tableau, dans les champs modifiable ( en haut de l'écran )
var item = myDataGridEvenements.SelectedItem as Evenement;
if ((item != null))
{
App.obj_myEvenement.ReadEvenementebyNumero(item.strEvtNumero);
TextBox_Description.Text = item.strDesignation;
TextBox_EvtNum.Text = item.strEvtNumeroString;
TextBox_Intervenant.Text = item.strCodeIntervenant;
TextBox_TypeEvenement.Text = item.strEvtType;
TextBloc_Note.Text = item.strNote;
DateTimePicker_Date.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDate);
DateTimePicker_Relance.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDateRelance);
TimePicker_Heure.Value = item.dDate;
}
}
private void Collection_Evenements_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
(e.OldItems[0] as Evenement).SupprimeEvenement();
InitialiserControles();
}
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
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);
}
private bool IsValid(DependencyObject obj)
{
// return false;
// The dependency object is valid if it has no errors,
//and all of its children (that are dependency objects) are error-free.
return !Validation.GetHasError(obj)&&
!LogicalTreeHelper.GetChildren(obj)
.OfType<DependencyObject>()
.Any(child => !IsValid(child));
}
}
以下是我的验证XAML:
<TextBox Grid.Column="1" Name="TextBox_Intervenant" TabIndex="2" VerticalAlignment="Center" Height="20" >
<TextBox.Text>
<Binding Path="strCodeIntervenant" >
<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>
---------
这是我的XAML.cs(为了更好地查看,稍微清理一下):
private string m_strCodeIntervenant;
public string strCodeIntervenant
{
get { return m_strCodeIntervenant; }
set
{
m_strCodeIntervenant = value;
if (m_strCodeIntervenant.Trim() != "")
{
if (m_objIntervenant.ReadIntervenantCodebyCode(m_strCodeIntervenant) != 0)
{
throw new ApplicationException(m_strCodeIntervenant.Trim() + " don't exist !");
}
FirePropertyChangedEvent("strCodeIntervenant");
}
else
{
m_objIntervenant.strNom = "";
m_objIntervenant.strIntervenant = "";
}
FirePropertyChangedEvent("objIntervenant.strNom");
}
}
public partial class MainWindow : Window
{
private void InitialiserControles()
{
TextBox_Description.Text = string.Empty;
TextBox_EvtNum.Text = string.Empty;
TimePicker_Heure.Value = null;
TextBox_Intervenant.Text = string.Empty;
TextBox_TypeEvenement.Text = string.Empty;
TextBloc_Note.Text = string.Empty;
DateTimePicker_Date.SelectedDate = DateTime.Today;
DateTimePicker_Relance.SelectedDate = null ;
}
public ObservableCollection<Evenement> Collection_Evenements = new ObservableCollection<Evenement>();
Evenement myEvenement = new Evenement();
private void MettreAJourTableauEvenements()
{
Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
myDataGridEvenements.ItemsSource = Collection_Evenements;
}
public MainWindow()
{
InitializeComponent();
this.DataContext = App.obj_myEvenement;
//Load Evenement in DataGrid
MettreAJourTableauEvenements();
}
private void myDataGridEvenements_SelectedCellsChanged_1(object sender, SelectedCellsChangedEventArgs e)
{
// Affiche le code évt sélectionné dans le tableau, dans les champs modifiable ( en haut de l'écran )
var item = myDataGridEvenements.SelectedItem as Evenement;
if ((item != null))
{
App.obj_myEvenement.ReadEvenementebyNumero(item.strEvtNumero);
TextBox_Description.Text = item.strDesignation;
TextBox_EvtNum.Text = item.strEvtNumeroString;
TextBox_Intervenant.Text = item.strCodeIntervenant;
TextBox_TypeEvenement.Text = item.strEvtType;
TextBloc_Note.Text = item.strNote;
DateTimePicker_Date.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDate);
DateTimePicker_Relance.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDateRelance);
TimePicker_Heure.Value = item.dDate;
}
}
private void Collection_Evenements_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
(e.OldItems[0] as Evenement).SupprimeEvenement();
InitialiserControles();
}
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
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);
}
private bool IsValid(DependencyObject obj)
{
// return false;
// The dependency object is valid if it has no errors,
//and all of its children (that are dependency objects) are error-free.
return !Validation.GetHasError(obj)&&
!LogicalTreeHelper.GetChildren(obj)
.OfType<DependencyObject>()
.Any(child => !IsValid(child));
}
}
公共部分类主窗口:窗口
{
私有void initialiserControls()
{
TextBox_Description.Text=string.Empty;
TextBox_EvtNum.Text=string.Empty;
TimePicker_Heure.Value=null;
TextBox\u Intervenant.Text=string.Empty;
TextBox_typeevennement.Text=string.Empty;
TextBloc_Note.Text=string.Empty;
DateTimePicker\u Date.SelectedDate=DateTime.Today;
DateTimePicker\u Relance.SelectedDate=null;
}
公共ObservableCollection_events=新ObservableCollection();
晚上我的聚会=新的晚上();
私人无效会议
{
Collection\u events=myEvenement.GetEvenementsForCliCode(App.obj\u myClient.m\u strCode);
Collection\u events.CollectionChanged+=Collection\u events\u CollectionChanged;
MyDataGridEvenments.ItemsSource=集合\u Evenments;
}
公共主窗口()
{
初始化组件();
this.DataContext=App.obj_myEvenement;
//数据网格中的负载均衡
MettreaJournatablueVenements();
}
私有void MyDataGridEvents\u SelectedCellsChanged\u 1(对象发送方,SelectedCellsChangedEventArgs e)
{
//在表格上标注代码和选择,并在表格上标注可修改的champs(上莱克兰)
var item=MyDataGridEvenments.SelectedItem作为Evenments;
如果((项!=null))
{
附录obj_myEvenement.ReadEvenmenteBynumero(项目strEvtNumero);
TextBox_Description.Text=item.strDesignation;
TextBox_EvtNum.Text=item.strevtnumering;
TextBox\u Intervenant.Text=item.strcodeinventerant;
TextBox_typeevennement.Text=item.strEvtType;
Text bloc_Note.Text=item.strNote;
DateTimePicker\u Date.SelectedDate=evement.ConvertToDateTimePicker(item.dDate);
DateTimePicker\u Relance.SelectedDate=evement.ConvertToDateTimePicker(item.dDateRelance);
TimePicker_Heure.Value=item.dDate;
}
}
私有无效集合\u events\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
(e.旧项目[0]作为晚上)。供应会议();
InitializerControls();
}
}
私有无效窗口\u加载\u 1(对象发送方,路由目标)
{
myDataGridEvenments.Focus();
MyDataGridEvents.SelectedIndex=0;
MoveFocus(新的遍历请求(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_参数LoadDataGridParams(MyDataGridEvents);
}
私有布尔值有效(DependencyObject对象)
{
//返回false;
//如果依赖项对象没有错误,则该对象有效,
//它的所有子对象(即依赖对象)都是无错误的。
return!Validation.GetHasError(obj)&&
!LogicalTreeHelper.GetChildren(obj)
第()类
.Any(child=>!IsValid(child));
}
}
此崩溃发生在生产“发布”或“调试模式”中
该异常是一个XamlParseException,InnerException={“TELOU不存在!”}
异常不会在文本框(警告标签)旁边显示“TELOU不存在”,而是不会引发
有人有什么想法吗
非常感谢:)
致以最良好的祝愿
Nixeus作为急救,请订阅dispatcher unhandle exception(最好在App.xaml.cs中) Msdn链接- 这将帮助您记录崩溃信息 尝试使用此方法对启用验证的文本框进行模板化
定义m\u strcodeintervent
字段的类的构造函数可能遇到崩溃。可能有东西正在使用以前缓存的“good”值,并通过直接设置字段绕过验证
在那里设置断点并分析发生的情况。XAML不显示异常,仅在输出窗口中显示
您的代码正在抛出错误,但仅显示在输出窗口中
当异常在控件的init上时,它无法处理并破坏应用程序
不要自己抛出异常来处理错误。如果应用程序崩溃,那么您应该得到一个异常。把它也发出去也会有帮助的。我是编辑