Cache public properties recalculated when DependencyProperty changes?
I want to cache public properties that depend on one or more DependencyProperty
values, such that they only get recalculated when the DependencyProperty
changes. My class inherits from FrameworkElement
and INotifyPropertyChanged
. I've followed some portions the answer here Implementing INotifyPropertyChanged. Simplified class:
public class ElementBase : FrameworkElement, INotifyPropertyChanged
static ElementBase()
WidthProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
HeightProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private static void OnCalculatedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
// how can property's string name be avoided
switch (e.Property.ToString()) // force update of non-dependency properties
case "Height": // is there a better way to force the recalculations?
((ElementBase)d).HalfHeight = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
case "Width":
((ElementBase)d).HalfWidth = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
default: break;
// Caching of the public properties.
private double halfWidth; // cached calculated half width
public double HalfWidth get => halfWidth; set halfWidth = Width / 2.0;
private double halfHeight; // cached calculated half height
public double HalfHeight get => halfHeight; set halfHeight = Height / 2.0;
private Point center; // cached calculated center point
public Point Center get => center; set center = new Point(HalfWidth, HalfHeight);
What I didn't see is:
- How to attach to
PropertyChangedEventHandler
events, so related nonDependencyProperty
properties to be recalculated? - How to avoid use of
DependencyProperty
string names? PropertyChangedCallback
entries forOverRideMetadata
of theDependencyProperty
work, but is that the best way?
c# wpf caching inotifypropertychanged frameworkelement
add a comment |
I want to cache public properties that depend on one or more DependencyProperty
values, such that they only get recalculated when the DependencyProperty
changes. My class inherits from FrameworkElement
and INotifyPropertyChanged
. I've followed some portions the answer here Implementing INotifyPropertyChanged. Simplified class:
public class ElementBase : FrameworkElement, INotifyPropertyChanged
static ElementBase()
WidthProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
HeightProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private static void OnCalculatedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
// how can property's string name be avoided
switch (e.Property.ToString()) // force update of non-dependency properties
case "Height": // is there a better way to force the recalculations?
((ElementBase)d).HalfHeight = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
case "Width":
((ElementBase)d).HalfWidth = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
default: break;
// Caching of the public properties.
private double halfWidth; // cached calculated half width
public double HalfWidth get => halfWidth; set halfWidth = Width / 2.0;
private double halfHeight; // cached calculated half height
public double HalfHeight get => halfHeight; set halfHeight = Height / 2.0;
private Point center; // cached calculated center point
public Point Center get => center; set center = new Point(HalfWidth, HalfHeight);
What I didn't see is:
- How to attach to
PropertyChangedEventHandler
events, so related nonDependencyProperty
properties to be recalculated? - How to avoid use of
DependencyProperty
string names? PropertyChangedCallback
entries forOverRideMetadata
of theDependencyProperty
work, but is that the best way?
c# wpf caching inotifypropertychanged frameworkelement
"What I didn't see is how to attach changes to cause related non DependencyProperty properties to be recalculated." Unless they get some flavor of change notificaiton, the only way to be aware of changes is polling. The whole ViewModel layer of MVVM exists because you do not always control the model and often have to wrap it in something you do control. Note that DependancyProperties are primarily tehre for GUI elements. For code behind you should generally use INotifyPropertyChanged. It is simpler.
– Christopher
Nov 14 '18 at 1:23
1
@codebender: PropertyChangedCallbacks are the best way to subscribe to dependency property changes. I don't think I understand what your actual issue is here. Where do you want events to be attached?
– mm8
Nov 14 '18 at 10:45
add a comment |
I want to cache public properties that depend on one or more DependencyProperty
values, such that they only get recalculated when the DependencyProperty
changes. My class inherits from FrameworkElement
and INotifyPropertyChanged
. I've followed some portions the answer here Implementing INotifyPropertyChanged. Simplified class:
public class ElementBase : FrameworkElement, INotifyPropertyChanged
static ElementBase()
WidthProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
HeightProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private static void OnCalculatedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
// how can property's string name be avoided
switch (e.Property.ToString()) // force update of non-dependency properties
case "Height": // is there a better way to force the recalculations?
((ElementBase)d).HalfHeight = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
case "Width":
((ElementBase)d).HalfWidth = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
default: break;
// Caching of the public properties.
private double halfWidth; // cached calculated half width
public double HalfWidth get => halfWidth; set halfWidth = Width / 2.0;
private double halfHeight; // cached calculated half height
public double HalfHeight get => halfHeight; set halfHeight = Height / 2.0;
private Point center; // cached calculated center point
public Point Center get => center; set center = new Point(HalfWidth, HalfHeight);
What I didn't see is:
- How to attach to
PropertyChangedEventHandler
events, so related nonDependencyProperty
properties to be recalculated? - How to avoid use of
DependencyProperty
string names? PropertyChangedCallback
entries forOverRideMetadata
of theDependencyProperty
work, but is that the best way?
c# wpf caching inotifypropertychanged frameworkelement
I want to cache public properties that depend on one or more DependencyProperty
values, such that they only get recalculated when the DependencyProperty
changes. My class inherits from FrameworkElement
and INotifyPropertyChanged
. I've followed some portions the answer here Implementing INotifyPropertyChanged. Simplified class:
public class ElementBase : FrameworkElement, INotifyPropertyChanged
static ElementBase()
WidthProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
HeightProperty.OverrideMetadata(typeof(ElementBase), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCalculatedValueChanged)));
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private static void OnCalculatedValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
// how can property's string name be avoided
switch (e.Property.ToString()) // force update of non-dependency properties
case "Height": // is there a better way to force the recalculations?
((ElementBase)d).HalfHeight = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
case "Width":
((ElementBase)d).HalfWidth = 0.0; // set overwrites with calculated value
((ElementBase)d).Center = new Point(0, 0); // set overwrites with calculated value
break;
default: break;
// Caching of the public properties.
private double halfWidth; // cached calculated half width
public double HalfWidth get => halfWidth; set halfWidth = Width / 2.0;
private double halfHeight; // cached calculated half height
public double HalfHeight get => halfHeight; set halfHeight = Height / 2.0;
private Point center; // cached calculated center point
public Point Center get => center; set center = new Point(HalfWidth, HalfHeight);
What I didn't see is:
- How to attach to
PropertyChangedEventHandler
events, so related nonDependencyProperty
properties to be recalculated? - How to avoid use of
DependencyProperty
string names? PropertyChangedCallback
entries forOverRideMetadata
of theDependencyProperty
work, but is that the best way?
c# wpf caching inotifypropertychanged frameworkelement
c# wpf caching inotifypropertychanged frameworkelement
edited Nov 14 '18 at 15:58
codebender
asked Nov 14 '18 at 1:19
codebendercodebender
1751415
1751415
"What I didn't see is how to attach changes to cause related non DependencyProperty properties to be recalculated." Unless they get some flavor of change notificaiton, the only way to be aware of changes is polling. The whole ViewModel layer of MVVM exists because you do not always control the model and often have to wrap it in something you do control. Note that DependancyProperties are primarily tehre for GUI elements. For code behind you should generally use INotifyPropertyChanged. It is simpler.
– Christopher
Nov 14 '18 at 1:23
1
@codebender: PropertyChangedCallbacks are the best way to subscribe to dependency property changes. I don't think I understand what your actual issue is here. Where do you want events to be attached?
– mm8
Nov 14 '18 at 10:45
add a comment |
"What I didn't see is how to attach changes to cause related non DependencyProperty properties to be recalculated." Unless they get some flavor of change notificaiton, the only way to be aware of changes is polling. The whole ViewModel layer of MVVM exists because you do not always control the model and often have to wrap it in something you do control. Note that DependancyProperties are primarily tehre for GUI elements. For code behind you should generally use INotifyPropertyChanged. It is simpler.
– Christopher
Nov 14 '18 at 1:23
1
@codebender: PropertyChangedCallbacks are the best way to subscribe to dependency property changes. I don't think I understand what your actual issue is here. Where do you want events to be attached?
– mm8
Nov 14 '18 at 10:45
"What I didn't see is how to attach changes to cause related non DependencyProperty properties to be recalculated." Unless they get some flavor of change notificaiton, the only way to be aware of changes is polling. The whole ViewModel layer of MVVM exists because you do not always control the model and often have to wrap it in something you do control. Note that DependancyProperties are primarily tehre for GUI elements. For code behind you should generally use INotifyPropertyChanged. It is simpler.
– Christopher
Nov 14 '18 at 1:23
"What I didn't see is how to attach changes to cause related non DependencyProperty properties to be recalculated." Unless they get some flavor of change notificaiton, the only way to be aware of changes is polling. The whole ViewModel layer of MVVM exists because you do not always control the model and often have to wrap it in something you do control. Note that DependancyProperties are primarily tehre for GUI elements. For code behind you should generally use INotifyPropertyChanged. It is simpler.
– Christopher
Nov 14 '18 at 1:23
1
1
@codebender: PropertyChangedCallbacks are the best way to subscribe to dependency property changes. I don't think I understand what your actual issue is here. Where do you want events to be attached?
– mm8
Nov 14 '18 at 10:45
@codebender: PropertyChangedCallbacks are the best way to subscribe to dependency property changes. I don't think I understand what your actual issue is here. Where do you want events to be attached?
– mm8
Nov 14 '18 at 10:45
add a comment |
1 Answer
1
active
oldest
votes
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
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%2f53291830%2fcache-public-properties-recalculated-when-dependencyproperty-changes%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
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
add a comment |
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
add a comment |
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
answered Nov 14 '18 at 8:59
RobRob
1,0441122
1,0441122
add a comment |
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%2f53291830%2fcache-public-properties-recalculated-when-dependencyproperty-changes%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
"What I didn't see is how to attach changes to cause related non DependencyProperty properties to be recalculated." Unless they get some flavor of change notificaiton, the only way to be aware of changes is polling. The whole ViewModel layer of MVVM exists because you do not always control the model and often have to wrap it in something you do control. Note that DependancyProperties are primarily tehre for GUI elements. For code behind you should generally use INotifyPropertyChanged. It is simpler.
– Christopher
Nov 14 '18 at 1:23
1
@codebender: PropertyChangedCallbacks are the best way to subscribe to dependency property changes. I don't think I understand what your actual issue is here. Where do you want events to be attached?
– mm8
Nov 14 '18 at 10:45