{"record":{"id":"ae731eaa0c048a61","repo":"MahApps/MahApps.Metro","slug":"this-dependency-property-can-only-be-attached-to-a","errorCode":null,"errorMessage":"This dependency property can only be attached to a ScrollViewer","messagePattern":"This dependency property can only be attached to a ScrollViewer","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/MahApps.Metro/Controls/Helper/ScrollViewerHelper.cs","lineNumber":437,"sourceCode":"        {\n            return (bool)obj.GetValue(BubbleUpScrollEventToParentScrollviewerProperty);\n        }\n\n        /// <summary>Helper for setting <see cref=\"BubbleUpScrollEventToParentScrollviewerProperty\"/> on <paramref name=\"obj\"/>.</summary>\n        /// <param name=\"obj\"><see cref=\"DependencyObject\"/> to set <see cref=\"BubbleUpScrollEventToParentScrollviewerProperty\"/> on.</param>\n        /// <param name=\"value\">BubbleUpScrollEventToParentScrollviewerProperty property value.</param>\n        [Category(AppName.MahApps)]\n        [AttachedPropertyBrowsableForType(typeof(ScrollViewer))]\n        public static void SetBubbleUpScrollEventToParentScrollviewer(DependencyObject obj, bool value)\n        {\n            obj.SetValue(BubbleUpScrollEventToParentScrollviewerProperty, BooleanBoxes.Box(value));\n        }\n\n        public static void OnBubbleUpScrollEventToParentScrollviewerPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)\n        {\n            if (!(sender is ScrollViewer viewer))\n            {\n                throw new ArgumentException(\"This dependency property can only be attached to a ScrollViewer\", nameof(sender));\n            }\n\n            if (e.OldValue != e.NewValue)\n            {\n                if ((bool)e.NewValue == true)\n                {\n                    viewer.PreviewMouseWheel += HandlePreviewMouseWheel;\n                }\n                else if ((bool)e.NewValue == false)\n                {\n                    viewer.PreviewMouseWheel -= HandlePreviewMouseWheel;\n                }\n            }\n        }\n\n        private static readonly List<MouseWheelEventArgs> ReentrantList = new();\n\n        private static void HandlePreviewMouseWheel(object? sender, MouseWheelEventArgs e)","sourceCodeStart":419,"sourceCodeEnd":455,"githubUrl":"https://github.com/MahApps/MahApps.Metro/blob/72099e310bac2d12ac98fd7560b69679252519f5/src/MahApps.Metro/Controls/Helper/ScrollViewerHelper.cs#L419-L455","documentation":"Thrown by OnBubbleUpScrollEventToParentScrollviewerPropertyChanged when the sender is not a ScrollViewer. The BubbleUpScrollEventToParentScrollviewer attached property only hooks PreviewMouseWheel on a ScrollViewer; attaching it to any other element type is rejected. Although the property is marked AttachedPropertyBrowsableForType(ScrollViewer), a change callback still validates the runtime type defensively.","triggerScenarios":"Setting helper:ScrollViewerHelper.BubbleUpScrollEventToParentScrollviewer on a non-ScrollViewer element (Grid, Border, StackPanel, ListBox); applying the attached property via code-behind SetValue on an arbitrary DependencyObject.","commonSituations":"Trying to forward scroll events from a non-ScrollViewer container; copy-pasting the attached property onto the wrong element in XAML.","solutions":["Set BubbleUpScrollEventToParentScrollviewer on a ScrollViewer element only.","If the scroll host is inside another control (e.g. ListBox), find/replace its internal ScrollViewer or use the appropriate ScrollViewer directly.","Remove the attached property from incompatible elements.","In code-behind, type-check the target before SetValue."],"exampleFix":"<!-- before -->\n<Grid helper:ScrollViewerHelper.BubbleUpScrollEventToParentScrollviewer=\"True\" /> <!-- throws -->\n\n<!-- after -->\n<ScrollViewer helper:ScrollViewerHelper.BubbleUpScrollEventToParentScrollviewer=\"True\"> ... </ScrollViewer>","handlingStrategy":"type-guard","validationCode":"if (obj is not ScrollViewer)\n{\n    throw new ArgumentException(\n        \"BubbleUpScrollEventToParentScrollviewer requires a ScrollViewer.\",\n        nameof(obj));\n}","typeGuard":"static bool IsScrollViewer(DependencyObject d) => d is ScrollViewer;","tryCatchPattern":null,"preventionTips":["Set BubbleUpScrollEventToParentScrollviewer on a ScrollViewer only.","For nested hosts, target the actual ScrollViewer element.","Type-check the target before SetValue in code-behind."],"tags":["wpf","attached-property","mahapps","scrollviewer","type-guard"],"backgroundTag":null,"analyzedSha":"72099e310bac2d12ac98fd7560b69679252519f5","analyzedAt":"2026-08-13T20:19:34.419Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}