从子组件设置父组件属性

3

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

我有一个基于ToggleButton的自定义控件,名为“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的有效值。”
我在值转换器中设置断点,但它们从未触发,所以我认为问题出在其他地方。
我做错了什么?

你提供了完整的控件模板吗?从我的角度来看,你的模板有问题,因为我甚至看不到任何上下文菜单。 - Alezis
1个回答

4
你遇到的错误是因为你设置了AncestorLevel=local:Substrate,而AncestorLevel期望的是Int32类型。
另外,你不能像你现在这样绑定Setter的属性,因为它不是一个DependencyProperty。你可以给你的MenuItem命名,并使用ControlTemplate.Trigger来更新触发器中Setter的控件属性:
 <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>

我已经进行了更改,错误已经消失了。但是该属性仍未设置。我尝试添加了值转换器,但仍然没有任何效果。 - user1029697
我在自己的端上尝试了一下,它运行正常。输出窗口有没有显示任何绑定错误? - Nitin
没问题,我会写一个小项目,避免所有的繁琐操作,看看能否让它正常运行。谢谢! - user1029697
好的,我找到了导致问题的原因。如果我使用绑定到SubstrateState属性,当按下菜单项时就不能再设置它了。目前我还没有解决方案,但会将其作为另一个问题发布。感谢您的帮助。 - user1029697

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接