首页 > 解决方案 > Popup 中的 ItemsControl 复制了添加的第一个项目

问题描述

我有一个带有的ItemsControl内部 a ,我将其简称为“集合”,绑定到该属性。PopupObservableCollectionItemsControl.ItemsSource

ItemsControl始终复制添加到集合中的第一个项目。然后ItemsControl对于之后添加的每个项目都表现正确。

我发现了一个类似的问题。但是,建议的解决方案并没有解决我的问题。

我有一种预感,这是由于使用了ItemsControl内部 aPopup但我无法弄清楚为什么会发生这种情况,而且只有第一个项目。

有什么建议么?

编辑:

Collection 在单独的单例类中更新。在初始化我的视图和视图模型时,我创建了一个本地集合,引用了单例中的集合。我可以确认没有重复的项目添加到集合中并且它的行为正确。

这是一些示例代码:

XAML:

<Popup IsOpen="{Binding ShowNotifications, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
       StaysOpen="True"
       AllowsTransparency="True">

    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">

        <ItemsControl ItemsSource="{Binding AlarmNotifications}">

            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>

                    <StackPanel/>

                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate>

                     <TextBlock Text="{Binding Exception.Message}"/>

                </DataTemplate>
            </ItemsControl.ItemTemplate>

        </ItemsControl>

    </ScrollViewer>

</Popup>

C# 视图模型

public ManagerClass Manager { get; set; }

public ObservableCollection<AlarmRegistry> AlarmNotifications { get; set; }

public bool ShowAlarmNotifications => AlarmNotifications.Any();

protected MainViewModel()
    {
        Manager = ManagerClass.Instance;

        AlarmNotifications = Manager.AlarmNotifications;

        AlarmNotifications.CollectionChanged += (sender, args) =>
        {
            OnPropertyChanged(nameof(ShowAlarmNotifications));
        };
    }

更新:

我发现了两种纠正重复的方法,这些方法涉及在添加第一项之前打开弹出窗口:

  1. 在 XAML 中删除Popup.IsOpen绑定并将其设置为 true。
  2. 将默认值设置ShowNotifications为 true。

这些方法会导致应用程序以 Popup 打开的方式启动,这是一种不受欢迎的行为。但是,这会阻止 ItemsControl 复制添加的第一个项目。如果在添加第一项之前再次关闭 Popup,则不会发生重复。

现在我正在寻找一种方法来保持弹出窗口在启动时关闭而不重复第一个项目。一种方法是试图诱使弹出窗口在之后立即打开和关闭。

如果您知道为什么会发生这种情况,或者如何应对,请告诉我。

标签: wpfxamlitemscontrol

解决方案


我最近遇到了同样的问题。我按顺序修复了它AllowsTransparency="True" IsOpen="True"。出于某种原因,如果您IsOpen首先指定透明度不起作用。还要注意IsOpen设置为始终为真。这解决了我的重复问题和透明度问题。希望有帮助。

<Popup AllowsTransparency="True" IsOpen="True">
    <!--your content goes here-->
</Popup>

推荐阅读