更新 这是一个复制链接 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;)
的行为由于
答案 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);
}
}