我试图理解为什么如果我不调用ValidationRule基构造函数,比如
public GrainWeightValidate() : base(ValidationStep.UpdatedValue, true) { }然后,当应该在LostFocus上调用验证规则时(如下面所示,在TextBox上使用),当TextBox确实失去焦点时,根本不会调用Validate函数。但是,如果我将下面的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>发布于 2015-02-19 19:55:30
您在StackOverflowException中运行是因为RelativeSource Self绑定。验证不是错误的来源。
在这里,您将Text DependencyProperty (TextProperty)绑定到同一个TextBox的Text属性。它的实现中的Text属性只需调用相应的DependencyProperty
因此,当失去对TextBox的关注时,绑定更新,更新Text,更新TextProperty DependencyProperty,更新Text,更新TextProperty.等等
移除RelativeSource属性,并使Path=“.”值的目标是ViewModel上的有效属性。
如果您不使用MVVM,那么您可能会像这样欺骗绑定:
<TextBox Name="GrainWeightTextBox" MinWidth="23">
<TextBox.Text>
<Binding ElementName="GrainWeightTextBox" Path="Tag" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<local:GrainWeightValidate/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>然后,通过访问Tag属性在代码后面获取您的值。它真的很脏,但它应该能用.
https://stackoverflow.com/questions/28614940
复制相似问题