The proper way to overcome such a loop is define a variable for every property an set those variables instead of the property itself...
private string _propA;
public string propA
{
get {}
set {
_propB = value;
_propC = value;
}
}
Something along this line..
I also advise you to write a single method to do all the updates and call it from all the properties, instead of setting them in each and every setter...
[EDIT]
A second options I used once in a complex scenario is to set a dirty flag for the core property and compute dependent properties only upon request...
private string _propA;
private bool _propAIsDiry;
public string propA
{
get {}
set {
_propAIsDirty = true;
}
}
public string propB
{
get {
if( _propAIsDiry) ComputePropB();
return( _propB );
}
set {}
}