私はテレリックを使用していますが、この質問にはあまり意味がありません。私のアプリケーションは WPF (.Net 4.5) です。
エラーテンプレートを持つすべてのコンボボックスに使用するスタイルがあります。スタイルは次のようになります。
<Style TargetType="{x:Type telerik:RadComboBox}" x:Key="RadComboBoxStyle" >
<Setter Property="FontFamily" Value="Calibri"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Background" Value="{StaticResource InputBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource InputBorderBrush}" />
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource RadComboBoxValidationErrorTemplate}" />
</Style>
私の ErrorTemplate は次のようになります。
<ControlTemplate TargetType="{x:Type Control}" x:Key="RadComboBoxValidationErrorTemplate">
<Grid ToolTipService.IsEnabled="True" ToolTipService.ShowOnDisabled="True"
ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors), Converter={StaticResource ValidationErrorsConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border BorderBrush="{StaticResource ErrorBrush}" BorderThickness="3" Panel.ZIndex="999" HorizontalAlignment="Right" Margin="0,0,10,0"
Background="Transparent" DockPanel.Dock="right" Width="16" Height="16" CornerRadius="10">
<Rectangle Fill="{StaticResource ErrorBrush}" HorizontalAlignment="Stretch" VerticalAlignment="Center" Height="3" RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<RotateTransform Angle="315" />
</Rectangle.RenderTransform>
</Rectangle>
</Border>
<AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
<Border BorderBrush="{StaticResource ErrorBrush}" BorderThickness="1" />
</AdornedElementPlaceholder>
</Grid>
</ControlTemplate>
全体がグローバルな ResourceDictionary で定義されています。
このコードが行うことは、ドロップダウン ボタンの直前 (余白を使用) で、コンボ ボックス (Panel.ZIndex="999") の上に「禁止記号」を配置することです。Border と Rectangle は、次のような記号を作成します: Picture .
コンボボックス自体は、ローカルに設定されたツールチップを保持できる必要があります。そのため、ローカルで解決せずに2つを組み合わせる方法を見つけない限り、コンボボックスのツールチップにエラーメッセージを表示することはできません(リソースディクショナリーにそのコードが必要です)。
また、「禁止サイン」でマウスのクリックを処理したくありません (ユーザーが「禁止サイン」をクリックすると、クリックをむさぼり食い、コンボボックスがドロップダウンするのを防ぎます。
グリッドと ErrorTemplate 内の境界線で IsHitTestVisible を false に設定しようとしましたが、ツールチップが表示されませんでした。また、同じ 2 つのコンストロールで IsEnabled を false に設定しようとしましたが、コンボボックス自体にマウスクリックが送信されません (コンボボックスのリストはドロップダウンしません)。
コンボボックススタイルまたはエラーテンプレートで直接これを行う方法はありますか? コードビハインドも気にしませんが、コンボボックススタイルが使用されている場所にコードをローカルに追加したくありません。