Designerbehavior of custom control with DependencyProperty
I find a strange behavior of xaml designer with a DataGrid-CustomControl. There I have a DependencyProperty:
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
"CustomizableColumns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable),
new PropertyMetadata(new ObservableCollection<DataGridColumn>()));
In the XAML-Designer I have the following code:
<ctrl:DataGridCustomizable
<ctrl:DataGridCustomizable.CustomizableColumns>
... the columns
In a overridden method
protected override void OnInitialized(EventArgs e)
I put the CustomizableColumns to the DataGrid Columns (only in DesignMode)
Now here is my notice. The first opening of the XAML designer, after a new build, perceives nothing from the CustomizableColumns. So in OnInitialized method, no any columns are added!
Then I close and reopen the XAML designer, and only just now the CustomizableColumns are known, and the OnInitialized method puts the CustomizableColumns to the DataGrid Columns.
Do you know the reason for it? Thanks for your input!
c# wpf xaml dependency-properties
add a comment |
I find a strange behavior of xaml designer with a DataGrid-CustomControl. There I have a DependencyProperty:
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
"CustomizableColumns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable),
new PropertyMetadata(new ObservableCollection<DataGridColumn>()));
In the XAML-Designer I have the following code:
<ctrl:DataGridCustomizable
<ctrl:DataGridCustomizable.CustomizableColumns>
... the columns
In a overridden method
protected override void OnInitialized(EventArgs e)
I put the CustomizableColumns to the DataGrid Columns (only in DesignMode)
Now here is my notice. The first opening of the XAML designer, after a new build, perceives nothing from the CustomizableColumns. So in OnInitialized method, no any columns are added!
Then I close and reopen the XAML designer, and only just now the CustomizableColumns are known, and the OnInitialized method puts the CustomizableColumns to the DataGrid Columns.
Do you know the reason for it? Thanks for your input!
c# wpf xaml dependency-properties
1
As a note, you must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the sameObservableCollection<DataGridColumn>
object unless you explictly assign a property value. Besides that, do you really need the collection to be observable? Are collection members ever added or removed at runtime?
– Clemens
Nov 25 '18 at 17:09
Yes! You are absolutely right! I still have to try it, but that's probably the problem. Thank you for your comment. If I confirm it, could you write it again as an answer so that I can mark it as "correct" for posterity?
– peter70
Nov 26 '18 at 14:51
add a comment |
I find a strange behavior of xaml designer with a DataGrid-CustomControl. There I have a DependencyProperty:
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
"CustomizableColumns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable),
new PropertyMetadata(new ObservableCollection<DataGridColumn>()));
In the XAML-Designer I have the following code:
<ctrl:DataGridCustomizable
<ctrl:DataGridCustomizable.CustomizableColumns>
... the columns
In a overridden method
protected override void OnInitialized(EventArgs e)
I put the CustomizableColumns to the DataGrid Columns (only in DesignMode)
Now here is my notice. The first opening of the XAML designer, after a new build, perceives nothing from the CustomizableColumns. So in OnInitialized method, no any columns are added!
Then I close and reopen the XAML designer, and only just now the CustomizableColumns are known, and the OnInitialized method puts the CustomizableColumns to the DataGrid Columns.
Do you know the reason for it? Thanks for your input!
c# wpf xaml dependency-properties
I find a strange behavior of xaml designer with a DataGrid-CustomControl. There I have a DependencyProperty:
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
"CustomizableColumns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable),
new PropertyMetadata(new ObservableCollection<DataGridColumn>()));
In the XAML-Designer I have the following code:
<ctrl:DataGridCustomizable
<ctrl:DataGridCustomizable.CustomizableColumns>
... the columns
In a overridden method
protected override void OnInitialized(EventArgs e)
I put the CustomizableColumns to the DataGrid Columns (only in DesignMode)
Now here is my notice. The first opening of the XAML designer, after a new build, perceives nothing from the CustomizableColumns. So in OnInitialized method, no any columns are added!
Then I close and reopen the XAML designer, and only just now the CustomizableColumns are known, and the OnInitialized method puts the CustomizableColumns to the DataGrid Columns.
Do you know the reason for it? Thanks for your input!
c# wpf xaml dependency-properties
c# wpf xaml dependency-properties
asked Nov 24 '18 at 23:38
peter70peter70
408720
408720
1
As a note, you must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the sameObservableCollection<DataGridColumn>
object unless you explictly assign a property value. Besides that, do you really need the collection to be observable? Are collection members ever added or removed at runtime?
– Clemens
Nov 25 '18 at 17:09
Yes! You are absolutely right! I still have to try it, but that's probably the problem. Thank you for your comment. If I confirm it, could you write it again as an answer so that I can mark it as "correct" for posterity?
– peter70
Nov 26 '18 at 14:51
add a comment |
1
As a note, you must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the sameObservableCollection<DataGridColumn>
object unless you explictly assign a property value. Besides that, do you really need the collection to be observable? Are collection members ever added or removed at runtime?
– Clemens
Nov 25 '18 at 17:09
Yes! You are absolutely right! I still have to try it, but that's probably the problem. Thank you for your comment. If I confirm it, could you write it again as an answer so that I can mark it as "correct" for posterity?
– peter70
Nov 26 '18 at 14:51
1
1
As a note, you must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same
ObservableCollection<DataGridColumn>
object unless you explictly assign a property value. Besides that, do you really need the collection to be observable? Are collection members ever added or removed at runtime?– Clemens
Nov 25 '18 at 17:09
As a note, you must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same
ObservableCollection<DataGridColumn>
object unless you explictly assign a property value. Besides that, do you really need the collection to be observable? Are collection members ever added or removed at runtime?– Clemens
Nov 25 '18 at 17:09
Yes! You are absolutely right! I still have to try it, but that's probably the problem. Thank you for your comment. If I confirm it, could you write it again as an answer so that I can mark it as "correct" for posterity?
– peter70
Nov 26 '18 at 14:51
Yes! You are absolutely right! I still have to try it, but that's probably the problem. Thank you for your comment. If I confirm it, could you write it again as an answer so that I can mark it as "correct" for posterity?
– peter70
Nov 26 '18 at 14:51
add a comment |
1 Answer
1
active
oldest
votes
You must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same ObservableCollection<DataGridColumn>
object unless you explictly assign a property value.
You should instead set the default value by a SetCurrentValue
call in the control's constructor.
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
nameof(CustomizableColumns),
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable));
...
public DataGridCustomizable()
{
SetCurrentValue(CustomizableColumnsProperty,
new ObservableCollection<DataGridColumn>());
}
Using SetCurrentValue
instead of just SetValue
ensures that any Binding, Style Setter or other dependency property value source still works correctly.
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53463362%2fdesignerbehavior-of-custom-control-with-dependencyproperty%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same ObservableCollection<DataGridColumn>
object unless you explictly assign a property value.
You should instead set the default value by a SetCurrentValue
call in the control's constructor.
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
nameof(CustomizableColumns),
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable));
...
public DataGridCustomizable()
{
SetCurrentValue(CustomizableColumnsProperty,
new ObservableCollection<DataGridColumn>());
}
Using SetCurrentValue
instead of just SetValue
ensures that any Binding, Style Setter or other dependency property value source still works correctly.
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
add a comment |
You must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same ObservableCollection<DataGridColumn>
object unless you explictly assign a property value.
You should instead set the default value by a SetCurrentValue
call in the control's constructor.
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
nameof(CustomizableColumns),
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable));
...
public DataGridCustomizable()
{
SetCurrentValue(CustomizableColumnsProperty,
new ObservableCollection<DataGridColumn>());
}
Using SetCurrentValue
instead of just SetValue
ensures that any Binding, Style Setter or other dependency property value source still works correctly.
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
add a comment |
You must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same ObservableCollection<DataGridColumn>
object unless you explictly assign a property value.
You should instead set the default value by a SetCurrentValue
call in the control's constructor.
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
nameof(CustomizableColumns),
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable));
...
public DataGridCustomizable()
{
SetCurrentValue(CustomizableColumnsProperty,
new ObservableCollection<DataGridColumn>());
}
Using SetCurrentValue
instead of just SetValue
ensures that any Binding, Style Setter or other dependency property value source still works correctly.
You must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same ObservableCollection<DataGridColumn>
object unless you explictly assign a property value.
You should instead set the default value by a SetCurrentValue
call in the control's constructor.
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
nameof(CustomizableColumns),
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable));
...
public DataGridCustomizable()
{
SetCurrentValue(CustomizableColumnsProperty,
new ObservableCollection<DataGridColumn>());
}
Using SetCurrentValue
instead of just SetValue
ensures that any Binding, Style Setter or other dependency property value source still works correctly.
answered Nov 26 '18 at 15:01
ClemensClemens
88.9k889180
88.9k889180
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
add a comment |
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
Excellent! Thanks alot :-)
– peter70
Nov 27 '18 at 5:47
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53463362%2fdesignerbehavior-of-custom-control-with-dependencyproperty%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
As a note, you must not set a default value of a mutable reference type dependency property by property metadata. All instances of your control would use the same
ObservableCollection<DataGridColumn>
object unless you explictly assign a property value. Besides that, do you really need the collection to be observable? Are collection members ever added or removed at runtime?– Clemens
Nov 25 '18 at 17:09
Yes! You are absolutely right! I still have to try it, but that's probably the problem. Thank you for your comment. If I confirm it, could you write it again as an answer so that I can mark it as "correct" for posterity?
– peter70
Nov 26 '18 at 14:51