为什么我不能将 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。
希望这对一些人有所帮助。
我们可以将 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。
希望这对一些人有所帮助。