Q:

Updating Total causing infinite loop

I current have 3 telerik:RadMaskedCurrencyInput. 
The first one is the principal
The First and Second are the disbursals
At the moment I have it set up such that principal = First disbursal + Second disbursal.
I'm trying to have a case such that if I update principal it updates First Disbursal and sets second disbursal to zero. So Principal = DisbursalOne and DisbursalTwo = 0
// Pv is principal
private decimal?_pv;
public decimal? Pv { get { return _pv; } set { _pv = value; OnPropertyChanged("Pv"); } }

private decimal? _disbursalOne;
public decimal? DisbursalOne
{
    get
    {
        return _disbursalOne;
    }
    set
    {
        _disbursalOne = value;
        if (_disbursalOne != null)
            DisbursalTotal = _disbursalOne + DisbursalTwo;
        else
        {
            _disbursalOne = 0;
        }
        OnPropertyChanged("DisbursalOne");
    }
}

Disbursal Two essentially almost identical to Disbursal one so the Code is not necessary.
private decimal? _disbursalTotal;
public decimal? DisbursalTotal 
{ 
    get { return _disbursalTotal; } 
    set
    { 
        _disbursalTotal = value;
        if (_disbursalTotal != null) UpdateDisbursalTotal(_disbursalTotal); 
            else UpdateDisbursalTotal(0);
        Pv = _disbursalTotal;
        OnPropertyChanged("DisbursalTotal"); 
    } 
}

I apologize for the bad title. 
// Updates the Total Disbursed Fields on the UI 
public void UpdateDisbursalTotal(decimal? Total)
{
    var cultureInfo       = Thread.CurrentThread.CurrentCulture;   // You can also hardcode the culture, e.g. var cultureInfo = new CultureInfo("fr-FR"), but then you lose culture-specific formatting such as decimal point (. or ,) or the position of the currency symbol (before or after)
    var numberFormatInfo  = (NumberFormatInfo)cultureInfo.NumberFormat.Clone();
    numberFormatInfo.CurrencySymbol = "$"; // Replace with "$" or "£" or whatever you need
    Double _total         = (double) Total;
    DisburseString        = _total.ToString("C", numberFormatInfo);
}

private string _disburseString;
public string DisburseString { get { return _disburseString; } set { _disburseString = value; OnPropertyChanged("DisburseString"); } }

A:

It's usually a good idea to format your PropertyChanged events in the following way, that way if the same value gets set, you don't notify anyone as nothing has actually changed.  If things are relying on your PropertyChanged events to update each other, this should break the cycle:
private decimal? _disbursalTotal;
public decimal? DisbursalTotal 
{ 
    get { return _disbursalTotal; } 
    set
    { 
        if (value != _disburseTotal) {
            _disbursalTotal = value;
            if (_disbursalTotal != null) UpdateDisbursalTotal(_disbursalTotal); 
                else UpdateDisbursalTotal(0);
            Pv = _disbursalTotal;
            OnPropertyChanged("DisbursalTotal"); 
        }
    } 
}

