我试图理解为什么我不调用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>
答案 0 :(得分:1)
由于RelativeSource Self
绑定,您正在StackOverflowException中运行。验证不是您的错误的来源。
在此处您将Text
的{{1}} DependencyProperty
(TextProperty
)绑定到同一TextBox的Text
属性。其实现中的TextBox
属性只调用相应的Text
:
因此,当失去对TextBox的关注时,Bindings会更新,并更新DependencyProperty
,更新Text
TextProperty
,更新DependencyProperty
,更新{ {1}} ......等等。
删除Text
属性,并使Path =“...”值成为ViewModel上的有效属性。
如果你不使用MVVM,那么你可以像这样欺骗Binding:
TextProperty
然后,通过访问RelativeSource
属性,在代码中获取您的价值。
它真的很脏,但应该有用......