单击

时间:2016-03-22 08:24:27

标签: wpf popup

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

返回原始问题:

我试着在这里找到一些答案,但却找不到任何答案。

我有一个项目集合,点击一个项目弹出窗口,当点击该项目外,弹出窗口关闭。出于某种原因,当弹出窗口打开时,当我再次单击相同的项目时,弹出窗口将关闭并重新打开而不是保持关闭状态。 以下是我的代码:

一些澄清: 我有两个系列。一个坐在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)

我很想知道为什么&#34; false&#34;价值两次 以及如何防止错误或第二次真实发生(更多 最好是假的,仍然有StaysOpen =&#34; False&#34;)

的行为

由于

1 个答案:

答案 0 :(得分:1)

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

我需要在打开弹出窗口时禁用“打开/关闭”按钮上的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);
    }
}