我正在尝试为我的ComboBox实现一个Watermark解决方案我在网上找到了某个地方(我再也找不到该页面),但是绑定有问题。原始解决方案有静态文本,我想使用绑定到ComboBoxes Tag属性来替换它。
这是我到目前为止所做的:
<Grid>
<Grid.Resources>
<VisualBrush x:Key="Watermark" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock FontStyle="Italic" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=Tag}"/>
</VisualBrush.Visual>
</VisualBrush>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="Margin" Value="5"/>
<Setter Property="IsEditable" Value="False"/>
<Setter Property="IsReadOnly" Value="True"/>
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{DynamicResource Watermark}"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" ItemsSource="{Binding Categories}" Tag="Categories"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding SubCategories}" Tag="SubCategories"/>
<ComboBox Grid.Column="2" ItemsSource="{Binding Whatever}" Tag="Whatever"/>
不幸的是,看起来“FindAncestor”部分无效。 谁能告诉我为什么?
提前致谢!
答案 0 :(得分:0)
我担心这并不容易。
首先,您无法像这样设置ComboxBox
Background
属性。一旦你尝试用一些硬编码文本替换RelativeSource-Binding,就会很明显。
其次,您必须确保VisualBrush资源是ComboBox
的VisualTree的一部分,而不是其他地方(例如,在包含Grid
中)。
重新模仿ComboBox
可以解决这两个问题。这可以通过首先创建新模板(作为副本)在Blend或Visual Studio中完成。然后你需要改变它。
将会有Grid
名为&#34; templateRoot&#34;。添加水印资源:
<Grid x:Name="templateRoot" SnapsToDevicePixels="True">
<Grid.Resources>
<VisualBrush x:Key="Watermark" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock FontStyle="Italic" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=Tag}"/>
</VisualBrush.Visual>
</VisualBrush>
</Grid.Resources>
<Grid.ColumnDefinitions>...
然后,在<ControlTemplate.Triggers>
部分的末尾,您需要插入另一个MultiDataTrigger
:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="{DynamicResource Watermark}"/>
</MultiDataTrigger>
必须是MultiTrigger
条件,否则它不可绑定。