列表视图和 StaysOpen=“False” 的弹出窗口无法正常工作
本文关键字:窗口 常工作 工作 StaysOpen 视图 False 列表 | 更新日期: 2023-09-27 18:34:11
我坚持弹出窗口的关闭行为。一直在搜索论坛,但找不到适合我情况的答案。我有一个列表视图和一个列表视图弹出窗口。单击列表视图项时应打开弹出窗口,并在单击其他内容(列表视图项除外)时关闭弹出窗口。我正在使用 MVVM,因此我已将弹出窗口的 IsOpen-Property 绑定到我的 VM 中的一个属性,该属性在绑定到 ListView 的 SelectedItemProperty 的属性中设置。代码如下所示:MainWindow.xaml
<Grid>
<ListView Name="List" ItemsSource="{Binding MyList}" SelectedItem="{Binding MyItem}" HorizontalAlignment="Left" />
<Popup IsOpen="{Binding PopupOpen}" Placement="Right" StaysOpen="False" PlacementTarget="{Binding ElementName=List}">
<TextBlock Text="I'm a Popup" />
</Popup>
</Grid>
我的 VM 中的代码如下所示:
public class MyVM
{
private string myItem;
private bool popupOpen;
public MyVM()
{
this.MyList = new List<string> { "Item 1", "Item 2", "Item 3" };
}
public List<string> MyList { get; set; }
public bool PopupOpen
{
get
{
return this.popupOpen;
}
set
{
this.popupOpen = value;
this.OnPropertyChanged();
}
}
public string MyItem
{
get
{
return this.myItem;
}
set
{
this.myItem = value;
this.OnPropertyChanged();
if (value != null)
{
this.PopupOpen = true;
}
}
}
}
就这样。现在,当我运行此示例应用程序时,弹出窗口会按预期打开,但仅当整个窗口失去焦点时才关闭。但是当我单击列表视图之外的某个位置时,它也应该关闭。
有什么想法吗?
好吧,我尝试了所有我想到的东西,比如鼠标捕获,玩弹出窗口内元素的焦点,从各种事件中打开弹出窗口(如 PreviewMouseDown,ListItem 的 PreviewMouseUp),但无法让 StaysOpen 功能正常工作。我没有想法,所以我自己实现了所需的 StaysOpen 功能:
为此,我注册了主窗口的PreviewMouseLeftButtonDown并处理其中弹出窗口的关闭,即在单击窗口时关闭所有弹出窗口。为了避免在弹出窗口内部单击时弹出窗口被关闭,我将相同的处理程序添加到弹出窗口并将"IsOpen"属性设置回"true"。丑陋,但它有效。
因此,如果有人有更好的想法或可以启发我有关StaysOpen-Property真正工作的内部功能,我将很高兴;)