none
Validierung von zwei Textboxen mit BindingGroup RRS feed

  • Allgemeine Diskussion

  • Hallo,

    Ich habe zwei Textboxen ein für Min value und ein für Max value.

    die Eingabe validierung von min und max habe ich mit IDataErrorInfo realisiert und es funktioniert.

    die prüfng ob min < max funktioniert aber nicht mit Bindinggroup.

    hier ist xaml

    <GroupBox FontWeight="Bold" Grid.Row="7" Grid.Column="1" Grid.ColumnSpan="3" Header="{DynamicResource SabGroupBoxHeader}">
                            <AdornerDecorator>
                                <Grid Name ="SabGrid" Margin="5,10,5,5" HorizontalAlignment="Center" VerticalAlignment="Center">
                                    <!--<Grid.BindingGroup>
                                        <BindingGroup>
                                            <BindingGroup.ValidationRules>
                                                <local:SabMinMaxValidationRule
                                                    ValidationStep="UpdatedValue"
                                                    ValidatesOnTargetUpdated="True"/>
                                            </BindingGroup.ValidationRules>
                                        </BindingGroup>
                                    </Grid.BindingGroup>-->
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                                        <ColumnDefinition Width="5"></ColumnDefinition>
                                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                                        <ColumnDefinition Width="20"></ColumnDefinition>
                                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                                        <ColumnDefinition Width="5"></ColumnDefinition>
                                        <ColumnDefinition></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"></RowDefinition>
                                        <RowDefinition Height="Auto"></RowDefinition>
                                        <RowDefinition Height="Auto"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <!-- SAB MIN -->
                                    <TextBlock Grid.Row="0" Grid.Column="0" FontWeight="Bold"  Text="{DynamicResource MinLabel}"></TextBlock>
                                    <TextBox Grid.Row="0" Grid.Column="2" MaxLength="15"  FontWeight="Normal" Name="sabMinTextBox" Width="100" HorizontalContentAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" VerticalContentAlignment="Center">
                                        <TextBox.Text>
                                            <Binding Path="SabMin" ValidatesOnDataErrors="True" ValidatesOnExceptions="True" UpdateSourceTrigger="PropertyChanged"/><!-- Mode="OneWayToSource"/>-->
                                        </TextBox.Text>
                                    </TextBox>
                                    <!--<ContentPresenter Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center"  Content="{Binding ElementName=sabMinTextBox, Path=(Validation.Errors).CurrentItem}"/>-->
                                    <!-- SAB MAX -->
                                    <TextBlock Grid.Row="0" Grid.Column="4" FontWeight="Bold" Text="{DynamicResource MaxLabel}"></TextBlock>
                                    <TextBox Grid.Row="0" Grid.Column="6" MaxLength="15"  FontWeight="Normal" Name="sabMaxTextBox" Width="100" HorizontalContentAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" VerticalContentAlignment="Center">
                                        <TextBox.Text>
                                            <Binding Path="SabMax" ValidatesOnDataErrors="True" ValidatesOnExceptions="True"  UpdateSourceTrigger="PropertyChanged"/><!-- Mode="OneWayToSource"/>-->
                                        </TextBox.Text>
                                    </TextBox>
                                    <!--<ContentPresenter Grid.Row="1" Grid.Column="6" HorizontalAlignment="Center"  Content="{Binding ElementName=sabMaxTextBox, Path=(Validation.Errors).CurrentItem}"/>-->
                                </Grid>
                            </AdornerDecorator>
                        </GroupBox>
    ...

    und die Validierung der eizelnen controls

     string ValidateSabMin()
            {
                try
                {
                    if (IsStringMissing(this.SabMin))
                    {
                        return m_win.FindResource("SabMinMissingError").ToString();
                    }
                    else
                    {
                        if (!IsDouble(this.SabMin))
                        {
                            return m_win.FindResource("SabMinInvalidError").ToString();
                        }
                        /*else
                        {
                            //eingabe valid. min und max vergleichen. min < max ?
                            //TODO: Fehlermeldung wird nicht  in beiden Felder MIN und MAX quittiert. mit flag arbeiten und beide validate aufrufen aber vorsicht vor endlosschleife 
                            if (!IsStringMissing(this.SabMax) && IsDouble(this.SabMax))
                            {
                                if (IsMinGreaterAsMax(this.SabMin, this.SabMax))
                                {
                                    return "MIN > MAX !";
                                }
                            }
                        }*/
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler bei Validierung der Sab Min", ex.Message);
                    if (m_win != null)
                    {
                        m_win.m_logFile.logData(ex.ToString());
                    }
                    return "validation error";
                }
            }

    die prüfung von min < max?

    public class SabMinMaxValidationRule : ValidationRule { public override ValidationResult Validate( object value, CultureInfo cultureInfo) { object sabMinObj; object sabMaxObj; double sabMin; double sabMax; BindingGroup bg = value as BindingGroup; if (bg == null) return new ValidationResult(false, "SabMinMaxValidationRule should only be used with a BindingGroup"); /*var laserTrimmingData = bg.Items[0] as LaserTrimmingData; bool result = Double.TryParse(laserTrimmingData.SabMin, out sabMin); if (result == false) throw new Exception("can not parse " + laserTrimmingData.SabMin + " to double"); result = Double.TryParse(laserTrimmingData.SabMax, out sabMax); if (result == false) throw new Exception("can not parse " + laserTrimmingData.SabMax + " to double");*/ // get sab min and sab max LaserTrimmingData data = (LaserTrimmingData)bg.Items[0]; bool sabMinResult = bg.TryGetValue(data, "SabMin", out sabMinObj); bool sabMaxResult = bg.TryGetValue(data, "SabMax", out sabMaxObj); if (!sabMinResult || !sabMaxResult) { return new ValidationResult(false, "Properties not found"); } bool result = Double.TryParse((string)sabMinObj, out sabMin); if (result == false) throw new Exception("can not parse " + sabMinObj.ToString() + " to double"); result = Double.TryParse((string)sabMaxObj, out sabMax); if (result == false) throw new Exception("can not parse " + sabMinObj.ToString() + " to double"); //double sabMax = Double.Parse((string)sabMaxObj); //double sabMin = Double.Parse((string)sabMinObj); // check sab min and max values together if (sabMin > sabMax) { return new ValidationResult(false, string.Format( "min: {0}, cannot be greater than max: {1}", sabMin, sabMax)); } else { return new ValidationResult(true, null); } } }

    SabMinMaxValidationRule funktioniert nicht. was mache ich falsch? oder kennt jemand eine andere lösung

    danke im voraus 

    Mittwoch, 13. Juni 2012 10:25

Alle Antworten