更新: 这是复制链接 https://drive.google.com/file/d/0BzalDCHAtuAPUk5vWF9PVUE2QzQ/view?usp=sharing
回到原来的问题:
我试图在这里找到一些答案,但还没有找到。
我有一个项目集合,其中单击项目时会打开弹出窗口,而在项目外部单击时会关闭弹出窗口。由于某种原因,当打开弹出窗口时,当我再次单击同一项目时,弹出窗口将关闭并重新打开,而不是保持关闭状态。 这是我的代码片段:
一些说明: 我有两个收藏。一个位于 ItemsControl 内,另一个位于 ListView 内。下面的 MouseClickToCommandBehavior 位于 ItemsControl 和 ListView 上。我用它来告诉弹出窗口何时打开和关闭。当我单击项目外部时,我还需要关闭弹出窗口。 目前,当我单击 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 并且仍然具有 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);
}
}
关于单击时 WPF 弹出窗口不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36149367/