Skip to content

Commit 2be6785

Browse files
xackusChrisPulman
andauthored
Fix Winforms Designer serialization errors (#4339)
<!-- Please be sure to read the [Contribute](https://github.com/reactiveui/reactiveui#contribute) section of the README --> **What kind of change does this PR introduce?** <!-- Bug fix, feature, docs update, ... --> This PR fixes winforms designer serialization of `ViewModelControlHost` and `RoutedControlHost` in `ReactiveUI.WinForms`. **What is the current behavior?** <!-- You can also link to an open issue here. --> `DesignerSerializationVisibility.Content` causes multiple issues: * `The object 'viewModelControlHost1' returned null for the property 'ViewModel' but this is not allowed` when trying to save (observed on `net481`). * Setting `DefaultContent` in the designer produces code that does not compile (observed on `net10.0-windows10.0.19041.0`). There are similar issues with other properties. The attribute also makes no sense on `DefaultCacheViewsEnabled`, because it's a static property. **What is the new behavior?** <!-- If this is a feature change --> Just turn off serialization for non-primitive properties. This also makes things consistent with `ReactiveUserControl.ViewModel`. Drop the attribute on `DefaultCacheViewsEnabled`. **What might this PR break?** This shouldn't break anything, the serialization did not work. **Please check if the PR fulfills these requirements** - [ ] Tests for the changes have been added (for bug fixes / features) - [ ] Docs have been added / updated (for bug fixes / features) **Other information**: Manual testing was performed on `net481` and `net10.0-windows10.0.19041.0`. `DesignerSerializationVisibility.Content` was introduced in #3933, probably because of a new analyzer error (`WFO1000`). Before that change the properties defaulted to `DesignerSerializationVisibility.Visible`, but that did not make sense either. The only property that could actually be set in the designer was `DefaultContent`, but doing that resulted in a fatal `ObjectDisposedException` when trying to reopen the designer. Co-authored-by: Chris Pulman <chris.pulman@yahoo.com>
1 parent ac2207c commit 2be6785

5 files changed

Lines changed: 36 additions & 40 deletions

File tree

src/ReactiveUI.Winforms/RoutedViewHost.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public RoutedControlHost()
9898
/// </value>
9999
[Category("ReactiveUI")]
100100
[Description("The default control when no viewmodel is specified")]
101-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
101+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
102102
public Control? DefaultContent
103103
{
104104
get => _defaultContent;
@@ -110,7 +110,7 @@ public Control? DefaultContent
110110
/// </summary>
111111
[Category("ReactiveUI")]
112112
[Description("The router.")]
113-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
113+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
114114
public RoutingState? Router
115115
{
116116
get => _router;
@@ -121,7 +121,7 @@ public RoutingState? Router
121121
/// Gets or sets the view contract observable.
122122
/// </summary>
123123
[Browsable(false)]
124-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
124+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
125125
public IObservable<string>? ViewContractObservable
126126
{
127127
get => _viewContractObservable;
@@ -132,7 +132,7 @@ public IObservable<string>? ViewContractObservable
132132
/// Gets or sets the view locator.
133133
/// </summary>
134134
[Browsable(false)]
135-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
135+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
136136
public IViewLocator? ViewLocator { get; set; }
137137

138138
/// <inheritdoc/>

src/ReactiveUI.Winforms/ViewModelViewHost.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public ViewModelControlHost()
4545
/// <summary>
4646
/// Gets or sets a value indicating whether [default cache views enabled].
4747
/// </summary>
48-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
4948
public static bool DefaultCacheViewsEnabled { get; set; }
5049

5150
/// <summary>
@@ -58,7 +57,7 @@ public ViewModelControlHost()
5857
/// </summary>
5958
[Category("ReactiveUI")]
6059
[Description("The default control when no viewmodel is specified")]
61-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
60+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
6261
public Control? DefaultContent
6362
{
6463
get => _defaultContent;
@@ -72,7 +71,7 @@ public Control? DefaultContent
7271
/// The view contract observable.
7372
/// </value>
7473
[Browsable(false)]
75-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
74+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
7675
public IObservable<string>? ViewContractObservable
7776
{
7877
get => _viewContractObservable;
@@ -83,14 +82,14 @@ public IObservable<string>? ViewContractObservable
8382
/// Gets or sets the view locator.
8483
/// </summary>
8584
[Browsable(false)]
86-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
85+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
8786
public IViewLocator? ViewLocator { get; set; }
8887

8988
/// <inheritdoc/>
9089
[Category("ReactiveUI")]
9190
[Description("The viewmodel to host.")]
9291
[Bindable(true)]
93-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
92+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
9493
public object? ViewModel
9594
{
9695
get => _viewModel;
@@ -103,7 +102,7 @@ public object? ViewModel
103102
[Category("ReactiveUI")]
104103
[Description("The Current View")]
105104
[Bindable(true)]
106-
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
105+
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
107106
public object? Content
108107
{
109108
get => _content;

src/tests/ReactiveUI.WinForms.Tests/API/ApiApprovalTests.Winforms.DotNet10_0.verified.txt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ namespace ReactiveUI.Winforms
7474
public RoutedControlHost() { }
7575
[System.ComponentModel.Category("ReactiveUI")]
7676
[System.ComponentModel.Description("The default control when no viewmodel is specified")]
77-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
77+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
7878
public System.Windows.Forms.Control? DefaultContent { get; set; }
7979
[System.ComponentModel.Category("ReactiveUI")]
8080
[System.ComponentModel.Description("The router.")]
81-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
81+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8282
public ReactiveUI.RoutingState? Router { get; set; }
8383
[System.ComponentModel.Browsable(false)]
84-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
84+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8585
public System.IObservable<string>? ViewContractObservable { get; set; }
8686
[System.ComponentModel.Browsable(false)]
87-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
87+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8888
public ReactiveUI.IViewLocator? ViewLocator { get; set; }
8989
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
9090
public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;
@@ -112,25 +112,24 @@ namespace ReactiveUI.Winforms
112112
[System.ComponentModel.Bindable(true)]
113113
[System.ComponentModel.Category("ReactiveUI")]
114114
[System.ComponentModel.Description("The Current View")]
115-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
115+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
116116
public object? Content { get; protected set; }
117117
public System.Windows.Forms.Control? CurrentView { get; }
118118
[System.ComponentModel.Category("ReactiveUI")]
119119
[System.ComponentModel.Description("The default control when no viewmodel is specified")]
120-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
120+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
121121
public System.Windows.Forms.Control? DefaultContent { get; set; }
122122
[System.ComponentModel.Browsable(false)]
123-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
123+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
124124
public System.IObservable<string>? ViewContractObservable { get; set; }
125125
[System.ComponentModel.Browsable(false)]
126-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
126+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
127127
public ReactiveUI.IViewLocator? ViewLocator { get; set; }
128128
[System.ComponentModel.Bindable(true)]
129129
[System.ComponentModel.Category("ReactiveUI")]
130130
[System.ComponentModel.Description("The viewmodel to host.")]
131-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
131+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
132132
public object? ViewModel { get; set; }
133-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
134133
public static bool DefaultCacheViewsEnabled { get; set; }
135134
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
136135
public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;

src/tests/ReactiveUI.WinForms.Tests/API/ApiApprovalTests.Winforms.DotNet8_0.verified.txt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ namespace ReactiveUI.Winforms
7474
public RoutedControlHost() { }
7575
[System.ComponentModel.Category("ReactiveUI")]
7676
[System.ComponentModel.Description("The default control when no viewmodel is specified")]
77-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
77+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
7878
public System.Windows.Forms.Control? DefaultContent { get; set; }
7979
[System.ComponentModel.Category("ReactiveUI")]
8080
[System.ComponentModel.Description("The router.")]
81-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
81+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8282
public ReactiveUI.RoutingState? Router { get; set; }
8383
[System.ComponentModel.Browsable(false)]
84-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
84+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8585
public System.IObservable<string>? ViewContractObservable { get; set; }
8686
[System.ComponentModel.Browsable(false)]
87-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
87+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8888
public ReactiveUI.IViewLocator? ViewLocator { get; set; }
8989
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
9090
public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;
@@ -112,25 +112,24 @@ namespace ReactiveUI.Winforms
112112
[System.ComponentModel.Bindable(true)]
113113
[System.ComponentModel.Category("ReactiveUI")]
114114
[System.ComponentModel.Description("The Current View")]
115-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
115+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
116116
public object? Content { get; protected set; }
117117
public System.Windows.Forms.Control? CurrentView { get; }
118118
[System.ComponentModel.Category("ReactiveUI")]
119119
[System.ComponentModel.Description("The default control when no viewmodel is specified")]
120-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
120+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
121121
public System.Windows.Forms.Control? DefaultContent { get; set; }
122122
[System.ComponentModel.Browsable(false)]
123-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
123+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
124124
public System.IObservable<string>? ViewContractObservable { get; set; }
125125
[System.ComponentModel.Browsable(false)]
126-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
126+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
127127
public ReactiveUI.IViewLocator? ViewLocator { get; set; }
128128
[System.ComponentModel.Bindable(true)]
129129
[System.ComponentModel.Category("ReactiveUI")]
130130
[System.ComponentModel.Description("The viewmodel to host.")]
131-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
131+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
132132
public object? ViewModel { get; set; }
133-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
134133
public static bool DefaultCacheViewsEnabled { get; set; }
135134
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
136135
public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;

src/tests/ReactiveUI.WinForms.Tests/API/ApiApprovalTests.Winforms.DotNet9_0.verified.txt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ namespace ReactiveUI.Winforms
7474
public RoutedControlHost() { }
7575
[System.ComponentModel.Category("ReactiveUI")]
7676
[System.ComponentModel.Description("The default control when no viewmodel is specified")]
77-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
77+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
7878
public System.Windows.Forms.Control? DefaultContent { get; set; }
7979
[System.ComponentModel.Category("ReactiveUI")]
8080
[System.ComponentModel.Description("The router.")]
81-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
81+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8282
public ReactiveUI.RoutingState? Router { get; set; }
8383
[System.ComponentModel.Browsable(false)]
84-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
84+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8585
public System.IObservable<string>? ViewContractObservable { get; set; }
8686
[System.ComponentModel.Browsable(false)]
87-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
87+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
8888
public ReactiveUI.IViewLocator? ViewLocator { get; set; }
8989
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
9090
public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;
@@ -112,25 +112,24 @@ namespace ReactiveUI.Winforms
112112
[System.ComponentModel.Bindable(true)]
113113
[System.ComponentModel.Category("ReactiveUI")]
114114
[System.ComponentModel.Description("The Current View")]
115-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
115+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
116116
public object? Content { get; protected set; }
117117
public System.Windows.Forms.Control? CurrentView { get; }
118118
[System.ComponentModel.Category("ReactiveUI")]
119119
[System.ComponentModel.Description("The default control when no viewmodel is specified")]
120-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
120+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
121121
public System.Windows.Forms.Control? DefaultContent { get; set; }
122122
[System.ComponentModel.Browsable(false)]
123-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
123+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
124124
public System.IObservable<string>? ViewContractObservable { get; set; }
125125
[System.ComponentModel.Browsable(false)]
126-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
126+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
127127
public ReactiveUI.IViewLocator? ViewLocator { get; set; }
128128
[System.ComponentModel.Bindable(true)]
129129
[System.ComponentModel.Category("ReactiveUI")]
130130
[System.ComponentModel.Description("The viewmodel to host.")]
131-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
131+
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
132132
public object? ViewModel { get; set; }
133-
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
134133
public static bool DefaultCacheViewsEnabled { get; set; }
135134
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
136135
public event System.ComponentModel.PropertyChangingEventHandler? PropertyChanging;

0 commit comments

Comments
 (0)