我有一个由ToggleButton
控制的PopUp控件。这很好用,但我不喜欢ToggleButton
的外观,所以我应用了一个控件模板,使ToggleButton
看起来像CheckBox
。我希望在PopUp可见时检查CheckBox
,并在PopUp窗口消失时取消选中。 <ToggleButton x:Name="LegendToggleButton"
HorizontalAlignment="Right"
IsChecked="{Binding IsOpen, ElementName=LegendPopup, mode=OneWayToSource}">
<ToggleButton.Template>
<ControlTemplate TargetType="ToggleButton">
<CheckBox x:Name="LegendCheckBox" Content="Show Legend" Style="{StaticResource {x:Type CheckBox}}"
IsChecked="{Binding IsOpen, ElementName=LegendPopup, Mode=TwoWay}" />
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
<Popup x:Name="LegendPopup"
PlacementTarget="{Binding ElementName=LegendToggleButton}"
Placement="Top"
PopupAnimation="Fade"
StaysOpen="False">
。我目前的代码如下,但我没有达到预期的效果。
CheckBox
在单击切换按钮时使窗口显示(div
变为选中状态,然后在单击其他控件时取消选中并隐藏弹出窗口,这可以正常工作。但是,如果我显示PopUp通过单击切换按钮,然后再次单击切换按钮(我希望隐藏弹出窗口),弹出窗口暂时关闭然后立即重新出现。
答案 0 :(得分:0)
为什么您希望ToggleButton
看起来像CheckBox
而不只是使用Checkbox
?以下代码就像魅力一样:
<CheckBox x:Name="CheckBox" Content="Check me to open popup" />
<Popup IsOpen="{Binding ElementName=CheckBox, Path=IsChecked}">
<Border Background="Silver" Padding="10">
<TextBlock Text="Hello" />
</Border>
</Popup>
如果你真的想要使用你的解决方案,你应该在他的评论中提供一个“适当的”模板作为sondergard。我不太确定你是否可以将CheckBox
嵌套为ToggleButton
的控件模板中的唯一元素。我要做的最少的事情是在TemplateBinding
和CheckBox.IsChecked
属性之间建立ToggleButton.IsChecked
,以便它们都同步。这也可能导致奇怪的行为,因为你实际上有两个弹出窗口绑定可以更新其IsOpen
属性(一个位于ToggleButton
,一个位于CheckBox
控制模板)。
答案 1 :(得分:0)
我提出了一个解决方案,与我最初提出的问题略有不同,但以下代码提供了我正在寻找的功能。该方法涉及将CheckBox
IsChecked
和PopUp IsOpen
属性绑定到viewmodel上的相同bool,并在CheckBox
失去焦点时将此bool设置为false(隐藏窗口并更新CheckBox
已检查属性。)
XAML:
<Popup x:Name="LegendPopup"
PlacementTarget="{Binding ElementName=LegendToggleButton}"
Placement="Top"
PopupAnimation="Fade"
StaysOpen="False"
IsOpen="{Binding ShowLegendPopup, Mode=OneWay}"
>
c#Viewmodel
private bool _showLegendPopup;
public bool ShowLegendPopup
{
get
{
return _showLegendPopup;
}
set
{
_showLegendPopup = value;
OnPropertyChanged();
}
}
public ICommand PopupClosingCommand { get; private set; }
private void InitialiseCommands()
{
PopupClosingCommand = new DelegatingCommand(PopupClosing);
}
private void PopupClosing()
{
ShowLegendPopup = false;
}
答案 2 :(得分:0)
IsChecked="{Binding IsOpen, ElementName=LegendPopup, mode=OneWayToSource}"
IsChecked="{Binding IsOpen, ElementName=LegendPopup, Mode=TwoWay}"
如果我纠正这些是罪魁祸首......
它实际上一次改变了IsChecked值两次..