在ControlTemplate
的{{1}}中,ToggleButton
触发IsChecked="True"
,False
触发另一个触发器。
<Trigger Property="ToggleButton.IsChecked" Value="True" >
<Setter TargetName="contentPresenter" Property="Content">
<Setter.Value>
<MultiBinding Converter="{StaticResource ContentChecked}">
<Binding Path="(ToggleButton.Content)" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="(ToggleButton.IsChecked)" RelativeSource="{RelativeSource TemplatedParent}"></Binding>
</MultiBinding>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ToggleButton.IsChecked" Value="False">
<Setter TargetName="contentPresenter" Property="Content">
<Setter.Value>
<MultiBinding Converter="{StaticResource ContentChecked}">
<Binding Path="(ToggleButton.Content)" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="(ToggleButton.IsChecked)" RelativeSource="{RelativeSource TemplatedParent}"></Binding>
</MultiBinding>
</Setter.Value>
</Setter>
</Trigger>
这完美无缺,但不太干。
我希望将样板文件传递给ControlTemplate.Resources
并使用 StaticResource 绑定将其添加到触发器中。像这样......
<ControlTemplate.Resources>
<SetterBaseCollection x:Key="ContentSetter">
<Setter TargetName="contentPresenter" Property="Content">
<Setter.Value>
<MultiBinding Converter="{StaticResource ContentChecked}">
<Binding Path="(ToggleButton.Content)" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="(ToggleButton.IsChecked)" RelativeSource="{RelativeSource TemplatedParent}"></Binding>
</MultiBinding>
</Setter.Value>
</Setter>
</SetterBaseCollection>
</ControlTemplate.Resources>
...并引用它... ...
<Trigger Property="ToggleButton.IsChecked" Value="True"
Setters="{StaticResource ContentSetter}" >
</Trigger>
但这失败了,因为没有&#34; Setter&#34; Setters
。
如何摆脱这个样板代码?
我使用MultiBinding
与IMultiValueConverter
将IsChecked
的当前值传递给 Converter 以决定返回的值。我传递给 Setter 的属性是内容,我将List<string>
传递给转换器,转换器负责{{1} }要根据List
的传递值返回的项目。
根据@Ash的建议,我将MultiBinding移到模板的IsChecked
元素上,并将所有触发器一起删除。
ContentPresenter.Content