为什么我不能将 ToggleButton.IsChecked 属性 附加到扩展器

Why can't I attach ToggleButton.IsChecked property to an Expander

我们可以将 DockPanel.Dock 附加到扩展器,但不能附加 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 注册的。

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

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

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

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

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

那么没有理由将它暴露在扩展器上 - 您可以在此处设置或绑定 IsChecked。

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