Почему вы не используете привязку? Именно для этого они предназначены ...
Если по какой-то причине вы не можете использовать привязку, вы можете добавить обработчик, который будет уведомлен при изменении значения свойства:
var topDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Rectangle));
var leftDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.LeftProperty, typeof(Rectangle));
topDescriptor.AddValueChanged(rectangle, rectangle_PositionChanged);
leftDescriptor.AddValueChanged(rectangle, rectangle_PositionChanged);
...
private void rectangle_PositionChanged(object sender, EventArgs e)
{
...
}