从子设置父属性

时间:2013-10-10 08:18:10

标签: c# wpf xaml binding custom-controls

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

我有一个基于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的有效值。”

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

我做错了什么?

1 个答案:

答案 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}}