C# 如何在嵌套的ControlTemplates中以元素为目标
在自定义组合框的样式中,当C# 如何在嵌套的ControlTemplates中以元素为目标,c#,wpf,xaml,controltemplate,C#,Wpf,Xaml,Controltemplate,在自定义组合框的样式中,当组合框.IsEditable属性设置为true时,我想更改切换按钮控制模板中边框元素的背景属性,但针对边框运行此错误: 找不到触发器目标。(目标必须出现在使用它的任何设置器、触发器或条件之前。) 我尝试过的事情: 按名称定位边框:TargetName=“Border” 将边框作为ToggleButton的子对象:TargetName=“ToggleButton.Border” 我能在网上找到的唯一信息是: TargetName仅在一个ControlTemplate部
组合框.IsEditable
属性设置为true时,我想更改切换按钮控制模板中边框元素的背景属性,但针对边框运行此错误:
找不到触发器目标。(目标必须出现在使用它的任何设置器、触发器或条件之前。)
我尝试过的事情:
- 按名称定位边框:
TargetName=“Border”
- 将边框作为ToggleButton的子对象:
TargetName=“ToggleButton.Border”
我能在网上找到的唯一信息是:
TargetName仅在一个ControlTemplate部分中操作
但我不确定这是否与我的情况有关,因为切换按钮的控制模板是我自定义组合框的控制模板的子项
风格(为简洁起见,删除了不相关的代码)
与其在嵌套模板上设置值,不如用另一种方法,通过一个。如果属性为True
,则使用DataTrigger
将边框的颜色设置为绿色
<Style x:Key="{x:Type local:CustomComboBox}" TargetType="{x:Type local:CustomComboBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomComboBox}">
<Grid>
<ToggleButton x:Name="ToggleButton" Focusable="False" ClickMode="Press"
VerticalContentAlignment="Center"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid>
<Border x:Name="Border" Grid.ColumnSpan="2"
Background="{Binding Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:CustomComboBox}}"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsEditable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:CustomComboBox}}" Value="True">
<Setter TargetName="Border" Property="Background" Value="Green"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在ToggleButton中没有边框
属性。无论如何,在这种情况下,您不需要使用TargetName=“ToggleButton.Border”
@emoacht Border是ToggleButton的ControlTemplate中的Border元素的名称。请解释我如何更改边框元素的背景属性而不在触发器中将其作为目标?如果未给出TargetName
,则目标将是local:CustomComboBox本身。然后在“Border”的Border.Background和local:CustomComboBox.Background之间设置绑定。相应地,此触发器将更改local:CustomComboBox.Background,然后该值将反映到“Border”的Border.Background。就这样。谢谢你的帮助,这完全解决了我的问题。另外,谢谢你花时间编辑我的问题,告诉我问题出在哪里,为什么我被否决。
<Style x:Key="{x:Type local:CustomComboBox}" TargetType="{x:Type local:CustomComboBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomComboBox}">
<Grid>
<ToggleButton x:Name="ToggleButton" Focusable="False" ClickMode="Press"
VerticalContentAlignment="Center"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid>
<Border x:Name="Border" Grid.ColumnSpan="2"
Background="{Binding Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:CustomComboBox}}"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsEditable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:CustomComboBox}}" Value="True">
<Setter TargetName="Border" Property="Background" Value="Green"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>