3

我想知道如何从样式中设置自定义控件的属性。

我有一个基于名为“Substrate”的切换按钮的自定义控件,在该按钮上我有一个名为“SubstrateState”的依赖属性。它需要一个枚举作为值。

在一个单独的文件中,我有一种向控件添加上下文菜单的样式。

当用户按下上下文菜单中的菜单项之一时,我希望该属性以一些预定义的值触发。

<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 的有效值”。

我在我的值转换器中设置了断点,它们从不触发,所以我认为问题出在其他地方。

我究竟做错了什么?

4

1 回答 1

4

你得到的错误是因为你设置了 AncestorLevel=local:Substrate,而 AncestorLevel 需要 Int32。

此外,您无法以您正在做的方式实现它。即你不能像你正在做的那样对 Setter 的属性进行绑定,因为它不是 DependancyProperty。您可以做的是在触发器的设置器中提供您MenuItem的 aName和使用来更新您的控件属性: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>
于 2013-10-10T08:23:34.297 回答