Cache public properties recalculated when DependencyProperty changes?










0















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 '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















0















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 '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













0












0








0








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 '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

















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












1 Answer
1






active

oldest

votes


















0














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



    );













    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









    0














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






    share|improve this answer



























      0














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






      share|improve this answer

























        0












        0








        0







        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 '18 at 8:59









        RobRob

        1,0441122




        1,0441122



























            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.




            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







            這個網誌中的熱門文章

            How to read a connectionString WITH PROVIDER in .NET Core?

            In R, how to develop a multiplot heatmap.2 figure showing key labels successfully

            Museum of Modern and Contemporary Art of Trento and Rovereto