我想知道如何从样式设置自定义控件的属性。
我有一个基于togglebutton的自定义控件,名为'Substrate',我有一个名为'SubstrateState'的dependencyproperty。它需要枚举值。
在一个单独的文件中,我有一个样式,可以向控件添加上下文菜单。
当用户按下上下文菜单中的一个菜单项时,我希望该属性以某个预定义值触发。
<Style TargetType="{x:Type local:Substrate}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Substrate}">
<Grid>
<Grid.ContextMenu>
<ContextMenu Background="#212121">
<MenuItem Header="Aborted">
<MenuItem.Style>
<Style TargetType="MenuItem">
<Style.Triggers>
<Trigger Property="IsPressed"
Value="True">
<Setter Property="{Binding SubstrateState, RelativeSource={RelativeSource AncestorLevel=local:Substrate}, Converter=converter:StringToSubstrateStatesConverter}"
Value="Aborted" />
</Trigger>
</Style.Triggers>
</Style>
</MenuItem.Style>
</MenuItem>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
当我跑步时,我得到: “在'System.Windows.Baml2006.TypeConverterMarkupExtension'上提供价值引发了异常。”
内部例外 “local:Substrate不是Int32的有效值。”
我在我的价值转换器中放置了断点,它们从不触发,因此我认为问题出在其他地方。
我做错了什么?
答案 0 :(得分:3)
你得到的错误是因为你设置了AncestorLevel = local:Substrate,而AncestorLevel需要Int32。
此外,你无法按照自己的方式实现目标。即你不能像你正在做的那样对Setter的属性进行绑定,因为它不是DependancyProperty。您可以做的是给MenuItem
Name
ControlTemplate.Trigger
并使用 <Style TargetType="{x:Type local:Substrate}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Substrate}">
<Grid>
<Grid.ContextMenu>
<ContextMenu Background="#212121">
<MenuItem x:Name="myMenuItem" Header="Aborted">
</MenuItem>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="myMenuItem" Property="IsPressed" Value="true">
<Setter Property="SubstrateState" Value="Aborted"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
更新触发器设置器中的控件属性:
{{1}}