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:




  1. How to attach to PropertyChangedEventHandler events, so related non DependencyProperty properties to be recalculated?

  2. How to avoid use of DependencyProperty string names?


  3. PropertyChangedCallback entries for OverRideMetadata of the DependencyProperty work, but is that the best way?










share|improve this question
























  • "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















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:




  1. How to attach to PropertyChangedEventHandler events, so related non DependencyProperty properties to be recalculated?

  2. How to avoid use of DependencyProperty string names?


  3. PropertyChangedCallback entries for OverRideMetadata of the DependencyProperty work, but is that the best way?










share|improve this question
























  • "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













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:




  1. How to attach to PropertyChangedEventHandler events, so related non DependencyProperty properties to be recalculated?

  2. How to avoid use of DependencyProperty string names?


  3. PropertyChangedCallback entries for OverRideMetadata of the DependencyProperty work, but is that the best way?










share|improve this question















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:




  1. How to attach to PropertyChangedEventHandler events, so related non DependencyProperty properties to be recalculated?

  2. How to avoid use of DependencyProperty string names?


  3. PropertyChangedCallback entries for OverRideMetadata of the DependencyProperty work, but is that the best way?







c# wpf caching inotifypropertychanged frameworkelement






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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


















  • "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












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.






share|improve this answer





















    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',
    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
    });


    }
    });














    draft saved

    draft discarded


















    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








    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.






    share|improve this answer

























      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.






      share|improve this answer























        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.






        share|improve this answer












        I think what you might be looking for is CoerceValue which was intended just for this. Look it up here.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 14 at 8:59









        Rob

        9711021




        9711021






























            draft saved

            draft discarded




















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

            ComboBox Display Member on multiple fields

            Is it possible to collect Nectar points via Trainline?