AvaloniaUI / Avalonia

Develop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The most popular .NET UI client technology
https://avaloniaui.net
MIT License
25.6k stars 2.21k forks source link

System.ArgumentException: An item with the same key has already been added. Key: [0, Avalonia.Controls.Generators.ItemContainerInfo] #8982

Closed sn4k3 closed 1 year ago

sn4k3 commented 2 years ago

Report

System.ArgumentException: An item with the same key has already been added. Key: [0, Avalonia.Controls.Generators.ItemContainerInfo]
   at System.Collections.Generic.TreeSet`1.AddIfNotPresent(T item)
   at Avalonia.Controls.Generators.ItemContainerGenerator.Materialize(Int32 index, Object item) in /_/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs:line 61
   at Avalonia.Controls.Presenters.ItemVirtualizerNone.AddContainers(Int32 index, IEnumerable items) in /_/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs:line 85
   at Avalonia.Controls.Presenters.ItemVirtualizerNone..ctor(ItemsPresenter owner) in /_/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs:line 17
   at Avalonia.Controls.Presenters.ItemVirtualizer.Create(ItemsPresenter owner) in /_/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs:line 203
   at Avalonia.Controls.Presenters.ItemsPresenter.PanelCreated(IPanel panel) in /_/src/Avalonia.Controls/Presenters/ItemsPresenter.cs:line 150
   at Avalonia.Controls.Presenters.ItemsPresenterBase.CreatePanel() in /_/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs:line 250
   at Avalonia.Controls.Presenters.ItemsPresenterBase.ApplyTemplate() in /_/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs:line 145
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Controls.Presenters.ScrollContentPresenter.MeasureOverride(Size availableSize) in /_/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs:line 254
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Controls.DockPanel.MeasureOverride(Size constraint) in /_/src/Avalonia.Controls/DockPanel.cs:line 91
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.Layoutable.MeasureOverride(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 613
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.LayoutHelper.MeasureChild(ILayoutable control, Size availableSize, Thickness padding) in /_/src/Avalonia.Layout/LayoutHelper.cs:line 46
   at Avalonia.Controls.Border.MeasureOverride(Size availableSize) in /_/src/Avalonia.Controls/Border.cs:line 187
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.LayoutHelper.MeasureChild(ILayoutable control, Size availableSize, Thickness padding) in /_/src/Avalonia.Layout/LayoutHelper.cs:line 46
   at Avalonia.Controls.Presenters.ContentPresenter.MeasureOverride(Size availableSize) in /_/src/Avalonia.Controls/Presenters/ContentPresenter.cs:line 366
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.LayoutHelper.MeasureChild(ILayoutable control, Size availableSize, Thickness padding) in /_/src/Avalonia.Layout/LayoutHelper.cs:line 46
   at Avalonia.Controls.Primitives.VisualLayerManager.MeasureOverride(Size availableSize) in /_/src/Avalonia.Controls/Primitives/VisualLayerManager.cs:line 131
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.Layoutable.MeasureOverride(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 613
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 549
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.Layoutable.MeasureOverride(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 613
   at Avalonia.Controls.Primitives.PopupRoot.MeasureOverride(Size availableSize) in /_/src/Avalonia.Controls/Primitives/PopupRoot.cs:line 124
   at Avalonia.Controls.WindowBase.MeasureCore(Size availableSize) in /_/src/Avalonia.Controls/WindowBase.cs:line 247
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in /_/src/Avalonia.Layout/Layoutable.cs:line 386
   at Avalonia.Layout.LayoutManager.Measure(ILayoutable control) in /_/src/Avalonia.Layout/LayoutManager.cs:line 285
   at Avalonia.Layout.LayoutManager.ExecuteInitialLayoutPass() in /_/src/Avalonia.Layout/LayoutManager.cs:line 196
   at Avalonia.Controls.WindowBase.Show() in /_/src/Avalonia.Controls/WindowBase.cs:line 170
   at Avalonia.Controls.Primitives.Popup.Open() in /_/src/Avalonia.Controls/Primitives/Popup.cs:line 500
   at Avalonia.Controls.Primitives.Popup.IsOpenChanged(AvaloniaPropertyChangedEventArgs`1 e) in /_/src/Avalonia.Controls/Primitives/Popup.cs:line 588
   at Avalonia.Controls.Primitives.Popup.<>c.<.cctor>b__23_1(Popup x, AvaloniaPropertyChangedEventArgs e) in /_/src/Avalonia.Controls/Primitives/Popup.cs:line 150
   at System.Reactive.Subjects.Subject`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/Subjects/Subject.cs:line 149
   at Avalonia.AvaloniaObject.RaisePropertyChanged[T](AvaloniaPropertyChangedEventArgs`1 change) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 756
   at Avalonia.Controls.Primitives.Popup.<>c.<.cctor>b__23_5(Popup o, Boolean v) in /_/src/Avalonia.Controls/Primitives/Popup.cs:line 42
   at Avalonia.DirectProperty`2.InvokeSetter(IAvaloniaObject instance, BindingValue`1 value) in /_/src/Avalonia.Base/DirectProperty.cs:line 164
   at Avalonia.AvaloniaObject.SetDirectValueUnchecked[T](DirectPropertyBase`1 property, BindingValue`1 value) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 820
   at Avalonia.Reactive.TypedBindingAdapter`1.OnNext(BindingValue`1 value) in /_/src/Avalonia.Base/Reactive/TypedBindingAdapter.cs:line 44
   at Avalonia.Reactive.BindingValueAdapter`1.OnNext(T value) in /_/src/Avalonia.Base/Reactive/BindingValueAdapter.cs:line 16
   at Avalonia.AvaloniaObject.RaisePropertyChanged[T](AvaloniaPropertyChangedEventArgs`1 change) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 761
   at Avalonia.AvaloniaObject.Avalonia.PropertyStore.IValueSink.ValueChanged[T](AvaloniaPropertyChangedEventArgs`1 change) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 509
   at Avalonia.ValueStore.NotifyValueChanged[T](AvaloniaProperty`1 property, Optional`1 oldValue, BindingValue`1 newValue, BindingPriority priority) in /_/src/Avalonia.Base/ValueStore.cs:line 366
   at Avalonia.ValueStore.SetExisting[T](Object slot, StyledPropertyBase`1 property, T value, BindingPriority priority) in /_/src/Avalonia.Base/ValueStore.cs:line 266
   at Avalonia.ValueStore.SetValue[T](StyledPropertyBase`1 property, T value, BindingPriority priority) in /_/src/Avalonia.Base/ValueStore.cs:line 100
   at Avalonia.Controls.MenuItem.Open() in /_/src/Avalonia.Controls/MenuItem.cs:line 323
   at Avalonia.Controls.Platform.DefaultMenuInteractionHandler.PointerPressed(Object sender, PointerPressedEventArgs e) in /_/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs:line 413
   at Avalonia.Interactivity.EventRoute.RaiseEventImpl(RoutedEventArgs e) in /_/src/Avalonia.Interactivity/EventRoute.cs:line 118
   at Avalonia.Interactivity.EventRoute.RaiseEvent(IInteractive source, RoutedEventArgs e) in /_/src/Avalonia.Interactivity/EventRoute.cs:line 79
   at Avalonia.Interactivity.Interactive.RaiseEvent(RoutedEventArgs e) in /_/src/Avalonia.Interactivity/Interactive.cs:line 123
   at Avalonia.Input.MouseDevice.MouseDown(IMouseDevice device, UInt64 timestamp, IInputElement root, Point p, PointerPointProperties properties, KeyModifiers inputModifiers) in /_/src/Avalonia.Input/MouseDevice.cs:line 235
   at Avalonia.Input.MouseDevice.ProcessRawEvent(RawPointerEventArgs e) in /_/src/Avalonia.Input/MouseDevice.cs:line 144
   at Avalonia.Input.InputManager.ProcessInput(RawInputEventArgs e) in /_/src/Avalonia.Input/InputManager.cs:line 37
   at Avalonia.Native.WindowBaseImpl.RawMouseEvent(AvnRawMouseEventType type, UInt32 timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) in /_/src/Avalonia.Native/WindowImplBase.cs:line 317
   at Avalonia.Native.WindowBaseImpl.WindowBaseEvents.Avalonia.Native.Interop.IAvnWindowBaseEvents.RawMouseEvent(AvnRawMouseEventType type, UInt32 timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) in /_/src/Avalonia.Native/WindowImplBase.cs:line 217
   at Avalonia.Native.Interop.Impl.__MicroComIAvnWindowBaseEventsVTable.RawMouseEvent(Void* this, AvnRawMouseEventType type, UInt32 timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) in /_/src/Avalonia.Native/Interop.Generated.cs:line 3785
--- End of stack trace from previous location ---
   at Avalonia.Native.PlatformThreadingInterface.RunLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Native/PlatformThreadingInterface.cs:line 90
   at Avalonia.Threading.Dispatcher.MainLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Base/Threading/Dispatcher.cs:line 65
   at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(String[] args) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 120
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 209
   at UVtools.WPF.Program.Main(String[] args) in /mnt/d/Tiago/Dropbox/Programming/C#/UVtools/UVtools.WPF/Program.cs:line 70
Category: Application

System

Operative system: Darwin 20.6.0 Darwin Kernel Version 20.6.0: Tue Jun 21 20:50:28 PDT 2022; root:xnu-7195.141.32~1/RELEASE_X86_64 X64 Processor cores: 8 Memory RAM: 7.22 / 15.94 GB Runtime: osx.11.0-x64 Framework: .NET 6.0.9 AvaloniaUI: 0.10.18

Additional information and Workflow

Can't reproduce, come from here: https://github.com/sn4k3/UVtools/issues/554

maxkatz6 commented 2 years ago

Probably a dup https://github.com/AvaloniaUI/Avalonia/issues/7467

sn4k3 commented 2 years ago

Probably a dup #7467

Looks the same trouble. I can't reproduce :(

joedemax commented 1 year ago

I am also facing this bug. To reproduce, create a ComboBox and set it's ItemSource in code to an ObservableCollection. Then, update your collection from another thread (a timer will do). As soon as it tries to update you'll get this exception.

timunie commented 1 year ago

@joedemax use Dispatcher.UiThread.Post to update a collection from another thread. Otherwise it's not allowed.

joedemax commented 1 year ago

Tim,

Thank you for your quick response. That worked just fine. Is there any other collection suitable for this that works similar to BindingList in WinForms where threading is automatically handled?

Joe

timunie commented 1 year ago

Hi Joe,

I personally use this: https://www.reactiveui.net/docs/handbook/collections/. It's a bit complex to learn it in the first step, but after that it works great. You still need to raise the events on the UIThread.

BR Tim

maxkatz6 commented 1 year ago

Was fixed after items presenter refactoring