为什么在LostFocus上调用ValidationRule派生类所需的ValidationRule基础构造函数?

时间:2015-02-19 19:14:54

标签: .net wpf validation lostfocus validationrule

我试图理解为什么我不调用ValidationRule基础构造函数,比如

public GrainWeightValidate() : base(ValidationStep.UpdatedValue, true) { }

然后,当LostFocus(使用TextBox,如下所示)调用验证规则 时,Validate函数不会被调用<当TextBox确实失去焦点时,em> at all 。但是,如果我将UpdateSourceTrigger更改为PropertyChanged,则会调用GrainWeightValidate.Validate(),但会无限期地调用,直到堆栈溢出为止。以下是相关的XAML:

<Viewbox Grid.Row="1" Grid.Column="4">
    <AdornerDecorator>
        <TextBox Name="GrainWeightTextBox" MinWidth="23">
            <TextBox.Text>
                <Binding RelativeSource="{RelativeSource Self}" Path="Text" UpdateSourceTrigger="LostFocus">
                    <Binding.ValidationRules>
                        <local:GrainWeightValidate/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </AdornerDecorator>
</Viewbox>

1 个答案:

答案 0 :(得分:1)

由于RelativeSource Self绑定,您正在StackOverflowException中运行。验证不是您的错误的来源。

在此处您将Text的{​​{1}} DependencyPropertyTextProperty)绑定到同一TextBox的Text属性。其实现中的TextBox属性只调用相应的Text

因此,当失去对TextBox的关注时,Bindings会更新,并更新DependencyProperty,更新Text TextProperty,更新DependencyProperty,更新{ {1}} ......等等。

删除Text属性,并使Path =“...”值成为ViewModel上的有效属性。

如果你不使用MVVM,那么你可以像这样欺骗Binding:

TextProperty

然后,通过访问RelativeSource属性,在代码中获取您的价值。 它真的很脏,但应该有用......