WPF弹出窗口不会在点击时关闭

WPF popup doesn`t close on click

更新: 这是一个 link 的复制品 https://drive.google.com/file/d/0BzalDCHAtuAPUk5vWF9PVUE2QzQ/view?usp=sharing

回到原问题:

我试图在这里找到一些答案,但没有找到任何答案。

我有一个 collection 的项目,点击一个项目会打开一个弹出窗口,当在项目外部单击时,弹出窗口会关闭。由于某种原因,当弹出窗口打开时,当我再次单击同一项目时,弹出窗口将关闭并重新打开,而不是保持关闭状态。 这是我的代码片段:

一些说明: 我有两个 collection。一个位于 ItemsControl 内,一个位于 ListView 内。下面的 MouseClickToCommandBehavior 位于 ItemsControl 和 ListView 上。我用它来告诉 Popup 何时打开和关闭。当我在项目外部单击时,我还需要关闭弹出窗口。 当前,当我单击 ListView 或 ItemsControl 中的某个项目时(当该项目的弹出窗口已经打开时),弹出窗口会重新打开而不是关闭。 发生这种情况是因为 StaysOpen 属性 设置为 "false",当我在项目外部单击时弹出窗口需要关闭。

回到原问题:

弹窗

<Popup IsOpen="{Binding ShowCustomerCardOptionsPopup, UpdateSourceTrigger=PropertyChanged}" StaysOpen="False"
       PlacementTarget="{Binding ElementName=CUstomerCardGrid}"
       Placement="Right">

打开弹出窗口的行为(在ListView上设置)

<i:Interaction.Behaviors>
    <behaviors:MouseClickToCommandBehavior Command="{Binding OpenPopupForCustomerCard}" CommandParameter="{Binding ElementName=CustomerCardsListView, Path=SelectedItem}"/>
</i:Interaction.Behaviors>

命令动作

private void OpenPopupForCustomerCardAction(ICustomerModel model)
{
    model.ShowCustomerCardOptionsPopup = !model.ShowCustomerCardOptionsPopup;
}

以及点击相同项目时的调用堆栈

value: True
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)
at POS.ViewModels.CustomerViewModel.OpenPopupForCustomerCardAction(ICustomerModel model)
at POS.InfraStructure.ActionCommand`1.Execute(Object parameter)
at POS.Views.Behaviors.MouseClickToCommandBehavior.AssociatedObject_MouseUp(Object sender, MouseButtonEventArgs e)

====================
value: False
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)

====================
value: False
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)

====================
value: True
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)
at POS.ViewModels.CustomerViewModel.OpenPopupForCustomerCardAction(ICustomerModel model)
at POS.InfraStructure.ActionCommand`1.Execute(Object parameter)
at POS.Views.Behaviors.MouseClickToCommandBehavior.AssociatedObject_MouseUp(Object sender, MouseButtonEventArgs e)

我很想知道为什么 "false" 值被调用了两次 以及如何防止错误或第二个正确的发生(更多 最好是 false 并且仍然具有 StaysOpen="False")

的行为

谢谢

我用按钮打开或关闭弹出窗口时遇到了同样的问题。

我需要在弹出窗口打开时禁用打开/关闭按钮上的IsHitTestVisible

IsHitTestVisible="{Binding IsOpen, ElementName=MyPopup, Mode=OneWay, Converter={StaticResource InverseBooleanConverter}}"

否则,当单击按钮时,弹出窗口将按照 StaysOpen="False" 的定义关闭。之后,由于单击按钮,它再次打开。

使用这个简单的转换器(只是为了完整性):

public class InverseBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !((bool)value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !((bool)value);
    }
}