У меня есть ItemsControl
внутри Popup
с ObservableCollection
, который я буду называть просто 'Collection', привязанным к свойству ItemsControl.ItemsSource
.
ItemsControl
всегда будет дублировать первый элемент, добавленный в коллекцию. ItemsControl
затем ведет себя корректно для каждого добавленного элемента.
- Операции с перекрестными потоками не выполняются.
- Коллекция обновляется только в одном месте, при этом создается один вызов для каждого элемента.
-
ItemsControl.ItemsPanel
- это StackPanel
без виртуализации.
Я нашел похожий вопрос . Однако предлагаемое решение не решило мою проблему.
У меня есть предчувствие, что я использую ItemsControl
внутри Popup
, но я не могу понять, почему это происходит, и только с первым элементом.
Есть предложения?
EDIT:
Коллекция обновляется в отдельном синглтон-классе. При инициализации моей View & ViewModel я создаю локальную коллекцию, ссылающуюся на коллекцию в синглтоне. Я могу подтвердить, что в Коллекцию не добавлены повторяющиеся элементы, и она ведет себя правильно.
Вот пример кода:
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 # View-Model :
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));
};
}
UPDATE:
Я нашел два подхода, которые исправляют дублирование, которое включает в себя открытие всплывающего окна перед добавлением первого элемента:
- Снятие привязки
Popup.IsOpen
и установка в XAML значения true.
- Установка значения по умолчанию
ShowNotifications
в true.
Эти подходы приводят к тому, что приложение запускается с открытым Popup, что является нежелательным поведением. Однако это останавливает ItemsControl, дублирующий первый добавленный элемент. Если всплывающее окно снова закрывается до добавления первого элемента, дублирование не происходит.
Теперь я ищу способ сохранить всплывающее окно закрытым при запуске без дублирования первого элемента. Один из подходов - попытаться заставить Popup открываться и закрываться сразу после.
Если вы знаете, почему это происходит или как с этим бороться, пожалуйста, дайте мне знать.