我们可以将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
。
答案 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。
希望这对一些人有所帮助。