1

XAML ではなく、コードでテキスト ボックスをフォームに追加しようとしています。エラー検証を使用します。次のコードがあります。

SearchTextBox stb = new SearchTextBox()
{
    Name = "stbRelatorio_" + id
};

// Create a new Binding.
Binding bindingStb = new Binding();
bindingStb.Source = model;
bindingStb.Path = new PropertyPath("ReportFile[" + id + "]");
stb.SetBinding(SearchTextBox.FileNameProprety, bindingStb);

BindingExpression bindingExpression =
    BindingOperations.GetBindingExpression(stb, SearchTextBox.FileNameProprety);

BindingExpressionBase bindingExpressionBase =
    BindingOperations.GetBindingExpressionBase(stb, SearchTextBox.FileNameProprety);

ValidationError validationError =
    new ValidationError(new ExceptionValidationRule(), bindingExpression);

Validation.MarkInvalid(bindingExpressionBase, validationError);

ControlTemplate ct = this.Resources["validationErrorTemplate"] as ControlTemplate;

これを行うと、テキストが挿入されていないときにデフォルトの動作が得られます (これは私のエラー ケースです)。テキスト ボックスの周りの赤いボックス。私が今欲しいのは、カスタムの Adorner Layout を使用して、XAML でビルドすることです。

<ControlTemplate x:Name="validationErrorTemplate" x:Key="validationErrorTemplate">
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
            <Grid Width="12" Height="12">
                <Ellipse Width="12" Height="12" 
                    Fill="Red" HorizontalAlignment="Center" 
                    VerticalAlignment="Center"></Ellipse>
                <TextBlock Foreground="White" FontWeight="Heavy" 
                    FontSize="8" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center"
                    ToolTip="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                    X
                </TextBlock>
            </Grid>
            <TextBlock Foreground="Red" FontWeight="12" Margin="2,0,0,2" 
                   Text="{Binding ElementName=ErrorAdorner, 
                   Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
            </TextBlock>
        </StackPanel>
        <AdornedElementPlaceholder x:Name="ErrorAdorner" />
    </DockPanel>
</ControlTemplate>

しかし、ErrorTemplate を設定しようとすると:

Validation.SetErrorTemplate(stb, ct);

デフォルトのテンプレートでさえ、エラーの検証はありません。

何か不足していますか?

4

2 に答える 2

2

あなたがするとき

ControlTemplate ct = this.Resources["validationErrorTemplate"] as ControlTemplate;
Validation.SetErrorTemplate(stb, ct);

デフォルトのエラー テンプレートさえありません。null である可能性がctあります。

「validationErrorTemplate」が Window ( this) リソースに格納されていることを確認してください。FindResourceテンプレートがリソースのどこかに保存されている場合、メソッドで見つけることができます

ControlTemplate ct = stb.FindResource("validationErrorTemplate") as ControlTemplate;
Validation.SetErrorTemplate(stb, ct);
于 2016-05-11T11:46:48.553 に答える
1

SearchTextBoxから継承されているのは正しいTextBoxですか?次に、バインディングを次のように変更します。

stb.SetBinding(TextBox.TextProperty, bindingStb);

アップデート:

ControlTemplate ct = FindResource("validationErrorTemplate") as ControlTemplate;
Validation.SetErrorTemplate(stb, ct);
于 2016-05-11T10:14:06.307 に答える