データベースにデータを含む WPF アプリケーションがあります。アプリで新しいデータを作成してデータベースに保存し、データベースからデータをロードできます。
たとえば、 Person クラスを作成しました。
私の WPF アプリケーションでは、Person を作成して、DataBase にアクセスできます。クライアントを作成すると、一部のテキストボックスが ExceptionValidationRule で有効になり、検証が false の場合、詳細エラーのラベルが表示されます。すべて問題ありません:)
私の質問は非常に簡単です。私のアプリの起動時に、MainWindow() で、DataBase のすべての Person オブジェクトを取得し、DataGrid にロードします。
「Personオブジェクト」をロードすると、検証が呼び出され(検証プロセスがset()関数であるため)、エラーが発生した場合、
throw new ApplicationException(....)
投げていません!エラーを示すラベルではなく、例外エラー ( XmlParseValidationException ) メッセージが表示されます。
それは、データが Person オブジェクトにロードされたときだけです。
結論として:
Person オブジェクトにバインドされた Textbox に不正なデータを入力した場合、検証が false の場合、すべて問題ありません。エラー ラベルが表示されます :)
不正なデータをデータベースから Person オブジェクトにロードすると、検証が false の場合、画面に例外メッセージ ボックスが表示されます。
ここに私の 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 デバッガーで Unhandlded Exception のチェックを外しました)。
編集: Windows_load イベントでデータベースから Observable コレクションにデータをロードした場合、バグはありませんが、例外が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<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;
この2行を削除すると、バインディングのためにテキストボックスが正しく初期化されますが、検証プロセスは呼び出されません。なんで ?検証プロセスを強制し、完全なバインディング whitout を使用する方法はありますか:
TextBox_Code.Text = item.strCode;
TextBox_Name.Text = item.strName;
ありがとう :)
ニクセウス