首页 > 解决方案 > ValidationRules 失败时未触发 WPF TextBox IValueConverter ConvertBack

问题描述

我有一个链接到双精度的文本框?在我的后端视图模型中。我需要在清空 TextBox 时触发 ConvertBack,但验证规则“ValidateNotNullOrWhiteSpace”失败,因此没有调用 ConvertBack。我的问题是,当我清空文本框时,我希望 viewModel 为空。现在 viewModel 保留旧值示例 10。

即使 ValidationRules 失败,有没有办法强制绑定?

<TextBox x:Name="txtSlabDepth"  Grid.Row="0" Grid.Column="1" Margin="0,3,0,0"
                             TextAlignment="Right" MaxLength="15" 
                             KeyDown="Textbox_KeyDown" TextChanged="Textbox_TextChanged" >
                    <Binding Path="SlabDepth">
                        <Binding.Converter>
                            <converters:LengthInchTextboxConverter x:Name="LengthInchTextboxConverter_SlabDepth"  />
                        </Binding.Converter>
                        <Binding.ValidationRules>
                            <validations:ValidateLength x:Name="ValidateLength_SlabDepth"/>
                            <validations:ValidateNotNullOrWhiteSpace x:Name="ValidateNotNullOrWhiteSpace_SlabDepth"/>
                        </Binding.ValidationRules>
                    </Binding>
                    <TextBox.Style>
                        <Style TargetType="TextBox">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=IsSlabDepthModified}" Value="True">
                                    <Setter  Property="Background" Value="Yellow" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBox.Style>
                </TextBox>

谢谢你。

标签: c#wpfbindingconvertersvalidationrules

解决方案


当您有一个可以实现INotifyDataErrorInfoorIDataErrorInfo接口的视图模型类时,您不应该使用验证规则来验证您的数据。

无论如何,您可以通过设置其属性来控制何时运行验证规则。ValidationStep

RawProposedValue是默认值。这意味着验证规则在任何值转换发生之前运行。如果您希望它在视图模型的源属性设置后运行,您应该将该ValidationStep属性设置为UpdatedValue

<validations:ValidateLength x:Name="ValidateLength_SlabDepth" ValidationStep="UpdatedValue" />

请参阅博客文章了解更多信息。


推荐阅读