Я создал приложение WPF с привязкой некоторого текстового поля. Я использую ошибку проверки, чтобы проверить, соответствуют ли значения. Проверка проверяет базу данных, чтобы увидеть, имеются ли введенные данные.XamlParseException on ValidationError при запуске приложения
Если я вхожу ложное значение, моя ошибка проверки поймать ошибку whitout проблемы :)
Тем не менее, если я вхожу хорошее значение, и если я закрою приложение и перейти на моей базе данных удалить значение, когда я заново запускаю приложение, загружаются самые последние данные, и здесь ... У меня есть хороший Crash: «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");
}
}
Вот мой Validation 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 (немного очистки для лучшего обзора):
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));
}
}
Этот аварийный сигнал возникает в режиме «освобождения» или «отладки».
Исключение составляет исключение XamlParseException с InnerException = {«TELOU не существует!»} Вместо отображения «TELOU не существует» в следующем текстовом поле (предупреждающая метка) исключение не выбрасывает.
У кого-нибудь есть идеи?
спасибо :)
С наилучшими пожеланиями,
Nixeus
Если ваше приложение выходит из строя, вы должны получить исключение. Было бы полезно также опубликовать его. – Jehof
Я отредактировал мое сообщение: Исключение составляет XamlParseException с InnerException = {«TELOU не существует!»} Вместо отображения «TELOU не существует» в следующем текстовом поле (предупреждающая метка) исключение не выбрасывает. –
Попробуйте следующее: (без кавычек) –