0

ValidationRule次のように、基本コンストラクターを呼び出さない場合の理由を理解しようとしています

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

次に、検証ルールを呼び出す必要があるときに(以下に示すようLostFocusに on a を使用して)、が実際にフォーカスを失った場合、関数はまったく呼び出されません。ただし、以下をに変更すると、が呼び出されますが、スタック オーバーフローが発生するまで無限に続きます。関連する XAML は次のとおりです。TextBoxValidateTextBoxUpdateSourceTriggerPropertyChangedGrainWeightValidate.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) を同じ TextBoxTextBoxのプロパティにバインドしています。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 に答える