wpf - Popup 中的 ItemsControl 复制了添加的第一个项目
问题描述
我有一个带有的ItemsControl
内部 a ,我将其简称为“集合”,绑定到该属性。Popup
ObservableCollection
ItemsControl.ItemsSource
将ItemsControl
始终复制添加到集合中的第一个项目。然后ItemsControl
对于之后添加的每个项目都表现正确。
- 没有发生跨线程操作。
- 集合仅在一个地方更新,每个项目创建一个调用。
- 这
ItemsControl.ItemsPanel
是StackPanel
没有虚拟化的。
我发现了一个类似的问题。但是,建议的解决方案并没有解决我的问题。
我有一种预感,这是由于使用了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));
};
}
更新:
我发现了两种纠正重复的方法,这些方法涉及在添加第一项之前打开弹出窗口:
- 在 XAML 中删除
Popup.IsOpen
绑定并将其设置为 true。 - 将默认值设置
ShowNotifications
为 true。
这些方法会导致应用程序以 Popup 打开的方式启动,这是一种不受欢迎的行为。但是,这会阻止 ItemsControl 复制添加的第一个项目。如果在添加第一项之前再次关闭 Popup,则不会发生重复。
现在我正在寻找一种方法来保持弹出窗口在启动时关闭而不重复第一个项目。一种方法是试图诱使弹出窗口在之后立即打开和关闭。
如果您知道为什么会发生这种情况,或者如何应对,请告诉我。
解决方案
我最近遇到了同样的问题。我按顺序修复了它AllowsTransparency="True" IsOpen="True"
。出于某种原因,如果您IsOpen
首先指定透明度不起作用。还要注意IsOpen
设置为始终为真。这解决了我的重复问题和透明度问题。希望有帮助。
<Popup AllowsTransparency="True" IsOpen="True">
<!--your content goes here-->
</Popup>
推荐阅读
- r - 以与显示的顺序相同的顺序从一列分组数据中过滤不同值的列表
- swift - 选择 SWIFT/XCODE 时使用按钮递增
- javascript - 无法使用服务工作者缓存诸如 css、js 和图像之类的 CORS 资产
- html - 如何使用当前代码实现 Jquery 切换功能?
- r - 上传到 RShiny 的文件的安全性——不持久
- hadoop - 没有 Hadoop 流媒体 jar
- amazon-web-services - 如何触发 SNS 订阅的“UnsubscribeConfirmation”?
- c++ - va_arg 以 mac 上的第二个参数开头(clang++)
- c# - 在 EF Core 中保存实体时,仅使用导航属性的 ID 会为该属性返回 null
- swift - 我需要插入一个项目吗?