0

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

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

然后当应该调用验证规则时LostFocus(使用TextBox如下所示),当确实失去焦点时,根本Validate不会调用该函数。但是,如果我在下面更改为, then会被调用,但会无限调用,直到堆栈溢出。以下是相关的 XAML:TextBoxUpdateSourceTriggerPropertyChangedGrainWeightValidate.Validate()

<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>
4

1 回答 1

1

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

在这里,您将Text DependencyProperty( TextProperty)绑定TextBox到同一个 TextBox 的Text属性。它的实现中的Text属性只是调用相应的DependencyProperty

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

删除RelativeSource属性,并使 Path="..." 值目标成为 ViewModel 上的有效属性。

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

    <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然后,通过访问该属性在代码中获取您的价值。它真的很脏,但它应该工作......

于 2015-02-19T19:55:30.563 回答