列表视图和 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;
            }
        }
    }
}

就这样。现在,当我运行此示例应用程序时,弹出窗口会按预期打开,但仅当整个窗口失去焦点时才关闭。但是当我单击列表视图之外的某个位置时,它也应该关闭。

有什么想法吗?

列表视图和 StaysOpen=“False” 的弹出窗口无法正常工作

好吧,我尝试了所有我想到的东西,比如鼠标捕获,玩弹出窗口内元素的焦点,从各种事件中打开弹出窗口(如 PreviewMouseDown,ListItem 的 PreviewMouseUp),但无法让 StaysOpen 功能正常工作。我没有想法,所以我自己实现了所需的 StaysOpen 功能:

为此,我注册了主窗口的PreviewMouseLeftButtonDown并处理其中弹出窗口的关闭,即在单击窗口时关闭所有弹出窗口。为了避免在弹出窗口内部单击时弹出窗口被关闭,我将相同的处理程序添加到弹出窗口并将"IsOpen"属性设置回"true"。丑陋,但它有效。

因此,如果有人有更好的想法或可以启发我有关StaysOpen-Property真正工作的内部功能,我将很高兴;)