为什么我不能将ToggleButton.IsChecked属性附加到Expander

时间:2016-05-25 16:50:08

标签: wpf xaml attached-properties

我们可以将DockPanel.Dock附加到Expander但我们无法附加ToggleButton.IsChecked。为什么呢?

<Expander DockPanel.Dock='Bottom'> <!--Compile-->
<Expander ToggleButton.IsChecked='True'> <!--Doesn't compile-->

我在源头找到了答案:

来自ToggleButton

public static readonly DependencyProperty IsCheckedProperty =
            DependencyProperty.Register(
                    "IsChecked",
                    typeof(bool?),
                    typeof(ToggleButton),
                    new FrameworkPropertyMetadata(
                            BooleanBoxes.FalseBox,
                            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal,
                            new PropertyChangedCallback(OnIsCheckedChanged)));

表格DockPanel

public static readonly DependencyProperty DockProperty =
            DependencyProperty.RegisterAttached(
                    "Dock", 
                    typeof(Dock), 
                    typeof(DockPanel),
                    new FrameworkPropertyMetadata(
                        Dock.Left, 
                        new PropertyChangedCallback(OnDockChanged)),
                    new ValidateValueCallback(IsValidDock));

Dock使用RegisterAttached方法注册,而不是Register

2 个答案:

答案 0 :(得分:3)

IsChecked不是一个可附加属性。如果您要绑定ToggleButton和Expander,可以执行以下操作:

<ToggleButton x:Name="toggle" IsChecked="True" />
<Expander IsExpanded="{Binding ElementName=toggle, Path=IsChecked}" />

答案 1 :(得分:0)

两者都是依赖属性,但正如您所指出的,一个是Register,一个是RegisterAttached。这就是差异以及为什么IsChecked无法暴露在其他控件上。请参阅此SO Post.中的不同答案(尤其是Haris Hasan),以便更好地解释两种注册方法之间的差异。

根据您上面的评论,如果您只想将CheckBox添加到Expander(Header)以及已经存在的ToggleButton,那么只需执行以下操作:

 <Expander>
    <Expander.Header>
        <CheckBox VerticalAlignment="Center" IsChecked="{Binding MyBooleanPropertySomewhere, Mode=TwoWay}"/>
    </Expander.Header>
</Expander>

然后没有理由让它暴露在扩展器上 - 你可以在那里设置或绑定IsChecked。

希望这对一些人有所帮助。