リンクした adorner ソリューションをいくつか変更して使用するか、スタイルとコンバーターを使用してこれを行うことができます。
装飾液
adorner ソリューションはより複雑ですが、より優れたインターフェイスとカプセル化を備えています。必要な変更は簡単ですが、WPF の専門家でないと難しいかもしれません。彼らです:
ComboBox を別の特殊なケース (TextBox など) として認識します。その SelectedItemChanged をサブスクライブし、SelectedItem==null を使用して装飾の可視性を更新します。
入力イベントを処理しない (HitTestVisible=False、Focusable=False など)
この場合、添付プロパティを設定するだけで、ComboBox スタイルは非常にシンプルになります。
スタイルとコンバーター
スタイルとコンバーターでそれを行う方が簡単かもしれません。コンバーターの本体は次のとおりです。
object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value==null ? Visibility.Visible : Visibility.Hidden;
}
あなたのスタイルは、デフォルトの ComboBox スタイルを置き換え、テーマからの ControlTemplate のコピーを含み、次のようなものでラップされます (または装飾を使用します):
<Style TargetType="{x:Class ComboBox}">
<Style.Setters>
<Setter Property="local:MyInputPromptClass.PromptText" Value="SELECT an item" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Class ComboBox}">
<Grid>
... existing XAML from theme ControlTemplate ...
<TextBlock
Text="{Binding local:MyInputPromptClass.PromptText, RelativeSource={RelativeSource TemplatedParent}}"
Visibility="{Binding SelectedItem, Converter={x:Static local:MyInputPromptClass.Converter}, RelativeSource={RelativeSource TemplatedParent}}"
HitTestVisible="False" Focusable="False"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
このソリューションは、テーマから既定の ComboBox テンプレートをコピーすると、現在の Windows テーマを追跡しないアプリになってしまうため、他のソリューションほど満足のいくものではありません。複数の ControlTemplate を StaticResource といくつかのトリッキーなバインドと共に使用することで、これを回避することができますが、その時点では、単に adorner と添付プロパティを使用することをお勧めします。