{"record":{"id":"8acf7df061047ba0","repo":"dotnet/wpf","slug":"sr-format-sr-nullpropertyillegal-eventsetter-event","errorCode":null,"errorMessage":"SR.Format(SR.NullPropertyIllegal, \"EventSetter.Event\")","messagePattern":"SR\\.Format\\(SR\\.NullPropertyIllegal, \"EventSetter\\.Event\"\\)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/EventSetter.cs","lineNumber":95,"sourceCode":"            set \n            { \n                CheckSealed();\n                _handledEventsToo = value; \n            }\n        }\n\n\n        //\n        //  Do the error checking that we can only do once all of the properties have been\n        //  set, then call up to base.\n        //\n        \n        internal override void Seal()\n        {\n\n            if (_event == null)\n            {\n                throw new ArgumentException(SR.Format(SR.NullPropertyIllegal, \"EventSetter.Event\"));\n            }\n            if (_handler == null)\n            {\n                throw new ArgumentException(SR.Format(SR.NullPropertyIllegal, \"EventSetter.Handler\"));\n            }\n            if (_handler.GetType() != _event.HandlerType)\n            {\n                throw new ArgumentException(SR.HandlerTypeIllegal);\n            }\n\n            base.Seal();\n            \n        }\n\n\n        private RoutedEvent    _event;\n        private Delegate         _handler;\n        private bool             _handledEventsToo;","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/EventSetter.cs#L77-L113","documentation":"EventSetter.Seal validates the setter before a Style/EventTrigger is finalized. It throws ArgumentException naming EventSetter.Event when the Event property (the RoutedEvent) is null, since an event setter must know which event to hook.","triggerScenarios":"Adding an EventSetter to a Style's Setters without setting Event, then sealing the style (style is used / sealed implicitly).","commonSituations":"XAML like <EventSetter Handler=\"...\"/> missing the Event attribute; code-built styles that forget style.Setters.Add with ev only partially configured.","solutions":["Set the Event property: <EventSetter Event=\"Button.Click\" Handler=\"OnButtonClick\"/>","In code, assign setter.Event = ButtonBase.ClickEvent before the style is sealed","Check style resources for EventSetter entries lacking an Event attribute"],"exampleFix":"// before\nvar es = new EventSetter { Handler = new RoutedEventHandler(OnClick) };\nstyle.Setters.Add(es); // throws on Seal\n// after\nvar es = new EventSetter { Event = ButtonBase.ClickEvent, Handler = new RoutedEventHandler(OnClick) };\nstyle.Setters.Add(es);","handlingStrategy":"validation","validationCode":"if (eventSetter.Event == null) throw new InvalidOperationException(\"EventSetter.Event must be set before sealing the style\");","typeGuard":"bool IsValidEventSetter(EventSetter s) => s?.Event != null;","tryCatchPattern":"try { style.Seal(); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"EventSetter.Event\")) { fixSetter(); }","preventionTips":["Always set both Event and Handler on EventSetter","Validate style setters before adding to shared styles"],"tags":["wpf","style","eventsetter","xaml"],"backgroundTag":"missing-required-argument","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}