John Sourcer
John Sourcer

Reputation: 451

Updating a control after INotifyPropertyChanged

I've checked the existing answers on Stack and still can't get this correct:

In my View:

<TextBlock Margin="8,0,0,0"

                        FontSize="48"
                        Text="{Binding YearsToSave}"
                        d:LayoutOverrides="Width">
...
  <SurfaceControls:SurfaceSlider x:Name="slider" Grid.Row="8"
                                Grid.Column="2"
                                VerticalAlignment="Bottom"
                                Maximum="{Binding YearsToSaveMaxValue}"
                                Minimum="{Binding YearsToSaveMinValue}"
                                Value="{Binding YearsToSave}"
                                d:LayoutOverrides="Width" />

In my view model:

class YearsToSaveViewModel : INotifyPropertyChanged
{
    private int yearsToSave;
    public event PropertyChangedEventHandler PropertyChanged;

    public YearsToSaveViewModel()
    {
        Questions = new SavingsCalculatorQuestions();
        YearsToSave = 5; //Binds correctly
        YearsToSaveMinValue = 0;
        YearsToSaveMaxValue = 30;
    }

    public SavingsCalculatorQuestions Questions { get; set; }

    public int YearsToSaveMinValue { get; private set; }

    public int YearsToSaveMaxValue { get; private set; }

    public int YearsToSave
    {
        get { return yearsToSave; } 
        set
        {
            yearsToSave = value;
            OnPropertyChanged("YearsToSave");
        }
    }

    public void Reset()
    {
        YearsToSave = 0;
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            switch (name)
            {
                case "YearsToSave":
                    Questions.NumberOfYears = YearsToSave;
                    break;
            }
        }
    }
}

The property changed event fires correctly and gets the value, updates the Questions.NumberOfYears correctly but the change never propagates back to the view.

Upvotes: 1

Views: 260

Answers (2)

Max
Max

Reputation: 3380

Another option is using the NotifyPropertyWeaver Project!

I like it,because it automatically does the Event call for you! (a bit of black magic but convenient)

See http://crosscuttingconcerns.com/NotifyPropertyWeaver

Upvotes: 2

Benjamin Gale
Benjamin Gale

Reputation: 13177

Your OnPropertyChanged method is not raising the PropertyChanged event...

Update your method like so:

protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        switch (name)
        {
            case "YearsToSave":
                Questions.NumberOfYears = YearsToSave;
                handler(this, new PropertyChangedEventArgs(name));
                break;
        }
    }
}

Upvotes: 2

Related Questions