Cache public properties recalculated when DependencyProperty changes?
up vote
0
down vote
favorite
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 |
up vote
0
down vote
favorite
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 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 at 10:45
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
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 at 15:58
asked Nov 14 at 1:19
codebender
1771415
1771415
"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 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 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 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 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 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 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 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 at 10:45
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
add a comment |
up vote
0
down vote
I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.
add a comment |
up vote
0
down vote
up vote
0
down vote
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 at 8:59
Rob
9711021
9711021
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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 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 at 10:45