简体   繁体   中英

WPF, EntLib: PropertyComparisonValidator does not update the UI of the compared value

I have a problem with the PropertyComparisonValidator of EntLib 5.0. I set up an simple form with an Min and a Max field. The validation is: when Min >= Max both properties are invalid.

    [RangeValidator(10, RangeBoundaryType.Inclusive, 100,
        RangeBoundaryType.Inclusive)]
    [PropertyComparisonValidator("MinVal", ComparisonOperator.GreaterThanEqual,
        MessageTemplate = @"Min cannot be greater or equal to Max")]
    [Required(ErrorMessage = @"MaxVal is required")]
    public int MaxVal
    {
        get { return (int)this.GetValue(MaxValProperty); }
        set { this.SetValue(MaxValProperty, value); }
    }

    [RangeValidator(1, RangeBoundaryType.Inclusive, 100,
        RangeBoundaryType.Inclusive)]
    [PropertyComparisonValidator("MaxVal", ComparisonOperator.LessThanEqual,
        MessageTemplate = @"Max cannot be less or equal to Min")]
    [Required(ErrorMessage = @"MinVal is required")]
    public int MinVal
    {
        get { return (int)this.GetValue(MinValProperty); }
        set { this.SetValue(MinValProperty, value); }
    }

The XAML:

    <TextBox x:Name="txtMinVal" Margin="0,0,5,0" TextWrapping="Wrap" Text="{Binding MinVal, ValidatesOnDataErrors=true, NotifyOnValidationError=true, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" VerticalAlignment="Center" Grid.Row="1"
    />

    <Label x:Name="lblMinVal" Content="Min Value" Margin="5,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Row="1"/>

    <TextBox x:Name="txtMaxVal" Margin="0,0,5,0" TextWrapping="Wrap" Text="{Binding MaxVal, ValidatesOnDataErrors=true, NotifyOnValidationError=true, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" VerticalAlignment="Center" Grid.Row="2"
    />
    <Label x:Name="lblMaxVal" Content="Max Value" Margin="5,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Row="2"/>

    <Button x:Name="btnSave" Content="Save" Margin="0" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" IsEnabled="{Binding IsValid}"/>

The problem is the UI. If I input Min=5 and Max=4 then both are invalid and marked with a red border.

BUT if I update Min=3 --> both shold be correct. Checking the validation it returns NO ERROR and is perfect. -> But the UI still remains red for Max. Only Min will be updated, because this field had a PropertyChanged.

Is there a working Min Max example with EntLib for WPF?

Thank you. Michele

Unfortunately, there is a design flaw in VAB 5.0 concerning the PropertyComparisonValidator . You can't decorate your objects with this validator when using one of the integration libraries (as you do for WPF). This is unfortunate, because I think that using a PropertyComparisonValidator is much cleaner than writing this in a [SelfValidation] method.

I created a discussion about this on the VAB forum. I hope the EntLib team will fix this in the next release.

In the meantime: don't use the PropertyComparisonValidator and write these validations in the [SelfValidation] method of a type.

I hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM