1

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

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

在我的 WPF 应用程序中,我可以创建一个 Person 并保存到数据库。当我创建客户端时,一些文本框使用 ExceptionValidationRule 进行验证,如果验证为假,则会出现一个带有详细错误的标签,一切正常:)

我的问题很简单:在我的 App Launching 中,在我的 MainWindow() 中,我将我的所有 Person 对象放在我的数据库中,并将其加载到 DataGrid 中。

当我加载“Person 对象”时,将调用验证(因为验证过程存在于 set() 函数中),并且,如果出现错误,则

throw new ApplicationException(....)

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

只有当数据被加载到 Person 对象中时。

所以,总结:

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

如果我将坏数据从数据库加载到 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 调试器中取消选中未处理的异常)。

编辑:如果我在 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;
    }

非常感谢 :)

编辑:如果我使用自定义验证器类,它可以!

只是一个问题,为了强制验证测试,当我在 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;

如果我删除这两行,文本框会因为绑定而被正确初始化,但不会调用验证过程。为什么 ?有没有办法强制验证过程并使用完整的绑定 whitout :

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

谢谢 :)

尼克修斯

4

1 回答 1

2

在事件中初始化您的对象,Window.Loaded而不是在构造函数中。当 Xaml 构造您的对象时,您无法正确地对异常做出反应。

于 2013-04-17T16:45:04.483 回答