2016-05-11 1 views
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レイアウトを使用することであると私はERRORTEMPLATEを設定しようとすると、私は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> 

でそれを構築する。しかし:

Validation.SetErrorTemplate(stb, ct); 

私はすべてのエラー検証を取得しない、ではありませんデフォルトのテンプレートでさえ。

何か不足していますか?

+0

によって発見することができますが、 'Validation.SetErrorTemplate(STB、CT)にブレークポイントを設定すると、' 'ct'はct'がnull値または'を持っていますか? – ASh

答えて

2

ctがある可能性が高いですnull

"validationErrorTemplate"がWindow(this)リソースに格納されていることを確認します。テンプレートは、リソースのどこかに保存されている場合、それはFindResource方法

ControlTemplate ct = stb.FindResource("validationErrorTemplate") as ControlTemplate; 
Validation.SetErrorTemplate(stb, ct); 
1

私はそうですSearchTextBoxTextBoxから継承されていますか? は、その後これに結合変更:

stb.SetBinding(TextBox.TextProperty, bindingStb); 

更新:あなたは

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

しないとさえデフォルトエラーテンプレートが何がある場合

ControlTemplate ct = FindResource("validationErrorTemplate") as ControlTemplate; 
Validation.SetErrorTemplate(stb, ct); 
+0

申し訳ありませんが、忘れてしまいました。また、 については、Validation.SetErrorTemplate(stb、ct); –

関連する問題