Вы можете использовать решение Adorner, с которым вы связались, с парой изменений, или вы можете сделать это с помощью стиля и конвертера.
Раствор 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. Можно обойти это, используя несколько ControlTemplates вместе со StaticResource и некоторые хитрые привязки, но на этом этапе я бы рекомендовал просто использовать adorner и присоединенное свойство.